C# 是否同时检测鼠标左键和右键单击?

C# 是否同时检测鼠标左键和右键单击?,c#,click,mouseevent,mouse,mouseclick-event,C#,Click,Mouseevent,Mouse,Mouseclick Event,我正在重新制作windows扫雷器(来自XP),其中包括的一点是,如果你同时用鼠标左键和右键单击一个数字,它会显示该数字周围的其他隐藏磁贴 我很难判断鼠标左键和右键何时同时按下。。。我使用了一对bool,每个按钮一个用于OnMouseDown和OnMouseUp事件,但是如果这两个按钮在完全相同的时间被单击(或真正关闭),那么只有一个MouseDown事件会关闭,而另一个不会。。。如果单击并按住其中一个按钮,然后单击并按住另一个按钮,则代码仍然有效 有没有更好的方法来检测这种“双重”点击 编辑:

我正在重新制作windows扫雷器(来自XP),其中包括的一点是,如果你同时用鼠标左键和右键单击一个数字,它会显示该数字周围的其他隐藏磁贴

我很难判断鼠标左键和右键何时同时按下。。。我使用了一对bool,每个按钮一个用于OnMouseDown和OnMouseUp事件,但是如果这两个按钮在完全相同的时间被单击(或真正关闭),那么只有一个MouseDown事件会关闭,而另一个不会。。。如果单击并按住其中一个按钮,然后单击并按住另一个按钮,则代码仍然有效

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

编辑:

好吧,关于我为什么把事情搞砸的小故事(它一直在起作用)

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

试试这个

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

为左侧和右侧按钮创建一个默认为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;
     }
完整代码:

    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;
    }

这是一个老问题,但我遇到了这个问题(巧合的是,也是在做一个扫雷舰克隆的时候),我觉得它遗漏了什么。如果您希望单击两个按钮,但仍能捕获常规的单按钮单击,则可以执行以下操作:

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;
    }
}
((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right) &&
((Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left)

它向上移动检测到鼠标,而不是向下移动鼠标。它不会做任何事情,直到你释放两个按钮。这几乎与Windows7版本的扫雷舰完全相同,只是在最初的版本中,只有右键可以在鼠标按下时操作。(我真的更喜欢我的版本)。有一点冗余,即根据您是先释放左键还是右键,在两个位置调用“双单击”案例,但无论如何,这应该是一个单行函数调用。额外好处:您可以从其他位置检查
tware\u click
标志,以便在光标周围绘制提示方块,显示释放按钮时将显示哪些方块。

另一个选项是使用System.Windows.Forms.Control类上的静态鼠标按钮

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

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;
    }
}
((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right) &&
((Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left)

您还可以查看

我在单击事件中获得了以下代码

if ((Control.MouseButtons == MouseButtons.Right) || (Control.MouseButtons == MouseButtons.Left))
当只按下一个鼠标按钮时,“Control.MouseButton”的值为“MouseButtons.None”


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

不起作用。e、 按钮不能同时有两个值。这可能是一个位掩码或其他东西,所以
如果e.Button和(MouseButtons.Left或MouseButtons.Right)=(MouseButtons.Left或MouseButtons.Right)
可能会起作用。我已经尝试了这两种方法。它们不是标志,它们是独立的实体,一次只能有一个。C#无法检测到任何鼠标点击。为此,您需要Windows窗体、Web窗体、WPF或SilverLight。你在想什么?我把你标记为答案,因为最后,这就是我应用程序中的代码。。。即使是我一直拥有的密码。愚蠢的mac…您还可以使用Control类在任何事件处理程序之外检索当前鼠标位置,这也非常方便。Control.mouseposition这确实有效。我认为最好是这样使用可读性很强的HasFlag()方法:(Control.MouseButtons.HasFlag(MouseButtons.Left)和&Control.MouseButtons.HasFlag(MouseButtons.Right))