6

我正在重新制作 Windows Minesweeper(来自 XP),他们所包含的内容是,如果您同时使用鼠标左键和右键单击一个带有与该数字一样多的标志的数字,它会显示该数字周围的所有其他隐藏图块.

我很难判断何时同时按下鼠标左键和右键...我正在使用一对布尔值,每个按钮一个对应于 OnMouseDown 和 OnMouseUp 事件,但如果 2 个按钮在完全相同的时间单击(或真正关闭),则只有一个 MouseDown 事件关闭,而另一个则没有...如果您单击并按住其中一个按钮,然后单击并按住另一个按钮,则代码仍然有效。

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

编辑:

好吧,关于我为什么把这件事搞砸的小故事(它一直有效)。

我有一个运行 Windows 7 的 macbook pro。对于那些不知道的人,macbook pro 有一个用于通常左键单击的鼠标按钮栏,但如果你将 2 根手指向下按右键单击,所以你可以t 两者都做(而且没有办法中键)。所以我正在构建我的应用程序并将其发送给我的朋友,他告诉我它不起作用,所以我发布了这个问题。我终于决定在我的另一台笔记本电脑上试用它,一台带有 2 个鼠标按钮的戴尔 XPS……一旦它在那里工作,我就把它传给了其他朋友,他们确认它工作正常。我不知道我的第一个朋友是怎么搞砸的,但这个故事的寓意是不要买苹果的任何东西。至少这是我得到的道德。

4

6 回答 6

8

为左右按钮创建一个类布尔变量,默认为false。当鼠标按下事件触发时,将变量设置为 true 并检查两者是否为 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;
     }
于 2010-07-09T02:17:25.860 回答
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;
    }
于 2010-07-09T02:37:35.193 回答
2

另一种选择是在System.Windows.Forms.Control类上使用静态MouseButtons

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

((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right) &&
((Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left)

您还可以查看 MSDN 示例

于 2016-09-21T09:44:42.673 回答
1

我得到以下代码在我的点击事件中工作。

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

当仅按下一个鼠标按钮时,“Control.MouseButton”假定值为“MouseButtons.None”

但是,当同时按下鼠标左键和右键时,“Control.MouseButton”假定“MouseButtons.Right”或“MouseButtons.Left”的值根据第一次/最后一次按下(取决于它的时间长短)在按下的左右按钮之间)

于 2019-01-22T13:15:16.310 回答
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
于 2010-07-09T01:47:03.670 回答
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从其他地方检查标志,以便在光标周围绘制提示方块,以显示当您释放按钮时将显示哪些方块。

于 2013-11-14T04:12:23.230 回答