同时检测鼠标左键和右键?

时间:2010-07-09 01:21:45

标签: c# click mouseevent mouse mouseclick-event

我正在重新制作Windows Minesweeper(来自XP),他们所包含的内容是,如果您同时使用鼠标左键单击带有尽可能多标记的数字,则会显示其他所有隐藏的图块在那个数字附近。

我很难说在同一时间同时按下鼠标左键和右键...我正在使用一对bool,每个按钮一个,包含OnMouseDown和OnMouseUp事件但是如果两个按钮在完全相同的时间(或非常接近)被点击,然后只有一个MouseDown事件关闭而另一个没有...如果你点击并按住其中一个按钮然后点击并按住另一个,代码工作虽然。

有没有更好的方法来检测这种“双重”点击?

修改

好吧,小故事为什么我把它搞砸了(它一直都有效)。

我有一个运行Windows 7的macbook pro。对于那些不知道的人,macbook pro只有一个鼠标按钮栏,通常会留下点击,但是如果你放下2个手指就会点击右键,所以你不能两者兼顾(也没办法中间点击)。所以我正在构建我的应用程序并将其发送给我的朋友,他告诉我它不起作用,所以我发布了这个问题。我终于决定在我的另一台笔记本电脑上试用它,带有2个鼠标按键的戴尔XPS ......一旦它在那里工作,我将它传递给其他朋友,他们确认它有效。我不知道我的第一个朋友是如何搞砸了,但故事的道德是不要买任何苹果。至少那是我得到的道德。

6 个答案:

答案 0 :(得分:7)

为左右按钮创建一个类boolean变量,默认为false。当鼠标按下事件触发时,将变量设置为true并检查两者是否都为真。当鼠标向上触发时,将变量设置为false。

    public bool m_right = false;
    public bool m_left = false;

    private void MainForm_MouseDown(object sender, MouseEventArgs e)
    {
        m_objGraphics.Clear(SystemColors.Control);

        if (e.Button == MouseButtons.Left)
            m_left = true;
        if (e.Button == MouseButtons.Right)
            m_right = true;

        if (m_left == false || m_right == false) return;
        //do something here
    }

    private void MainForm_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
            m_left = false;
        if (e.Button == MouseButtons.Right)
            m_right = false;
     }

答案 1 :(得分:2)

完整代码:

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left) leftPressed = true;
        else if (e.Button == MouseButtons.Right) rightPressed = true;


        if (leftPressed && rightPressed)
        {
            MessageBox.Show("Hello");

            // note: 
            // the following are needed if you show a modal window on mousedown, 
            // the modal window somehow "eats" the mouseup event, 
            // hence not triggering the MouseUp event below
            leftPressed = false;
            rightPressed = false;
        }


    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left) leftPressed = false;
        else if (e.Button == MouseButtons.Right) rightPressed = false;
    }

答案 2 :(得分:0)

试试这个,

Private Sub Form_Click(... , ByVal e As ystem.Windows.Forms.MouseEventArgs)

If e.Button = MouseButtons.Right And e.Button = MouseButtons.Left Then
MsgBox ('Right & Left code')

End If

答案 3 :(得分:0)

这是一个古老的问题,但我偶然发现了这个问题(巧合的是,在做扫雷克隆时也是如此),并感到它遗失了一些东西。如果您想要按两次按钮,但仍然可以捕获常规的单键按钮,则可以执行以下操作:

private bool left_down;
private bool right_down;
private bool both_click;

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        left_down = true;
        if (right_down)
            both_click = true;
    }
    if (e.Button == MouseButtons.Right)
    {
        right_down = true;
        if (left_down)
            both_click = true;
    }
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        if (!right_down)
        {
            if (both_click)
                //Do both-click stuff here
            else
                //Do left-click stuff here
            both_click = false;
        }
        left_down = false;
    }
    if (e.Button == MouseButtons.Right)
    {
        if (!left_down)
        {
            if (both_click)
                //Do both-click stuff here
            else
                //Do right-click stuff here
            both_click = false;
        }
        right_down = false;
    }
}

它将检测移动到鼠标向上而不是鼠标按下。在释放两个按钮之前,它不会执行任何操作。这几乎与扫雷的Windows 7版本完全相同,只是单独的右按钮在鼠标按下操作。 (老实说,我更喜欢我的版本)。有一些冗余,因为双击情况在两个地方被调用,这取决于你是先释放左按钮还是右按钮,但这应该是单线函数调用无论如何。奖励:您可以从其他地方查看both_click标志,以便在光标周围绘制提示方框,显示释放按钮时将显示哪些方块。

答案 4 :(得分:0)

另一种选择是在 System.Windows.Forms.Control

上使用静态 MouseButtons

这将告诉您当前按下了哪些鼠标按钮,以便您可以执行以下操作:

uint8_t GyroReadByte(uint8_t addr) {
    GPIOE->BSRR = (1 << 19);
    GPIOE->BSRR = (1 << 24);
    volatile uint8_t val;
    //addr |= R_BIT;
    GyroSendByte(addr); //val = GyroTransferByte(addr);
    val = GyroTransferByte(DUMMY);
    GPIOE->BSRR = (1 << 3);
    GPIOE->BSRR = (1 << 8); 
    return val;
}
void GyroSendByte(uint8_t data) {
    GPIOE->BSRR = (1 << 19);
    volatile uint8_t * const ptr = (volatile uint8_t *)&SPI1->DR;
    while (!(SPI1->SR & SPI_SR_TXE)) {}
    ;
    *ptr = data;
    GPIOE->BSRR = (1 << 3);
}

您还可以查看MSDN example

答案 5 :(得分:0)

我在Click事件中使用了以下代码。

if ((Control.MouseButtons == MouseButtons.Right) || (Control.MouseButtons == MouseButtons.Left))

当只按下一个鼠标按钮时,“ Control.MouseButton”将采用“ MouseButtons.None”的值

但是当同时按下鼠标左键和右键时,“ Control.MouseButton”将采用“ MouseButtons.Right”或“ MouseButtons.Left”的值,具体取决于第一次/最后一次按下(取决于持续多长时间)时间是在按下左右按钮之间)