在 MouseDown 事件处理程序中检测 Ctrl+Left(鼠标按钮)

Posted

技术标签:

【中文标题】在 MouseDown 事件处理程序中检测 Ctrl+Left(鼠标按钮)【英文标题】:Detecting Ctrl+Left (mouse button) in MouseDown event handler 【发布时间】:2013-02-03 12:14:19 【问题描述】:

当我第一次按下控制键(左键)然后单击鼠标左键时,为什么会执行以下代码。我正在修改现有代码,下面的代码已经存在。我想以前没有人尝试过,按下控制键,它只用于鼠标左键单击,它一直适用于这种情况。但我希望在按下控制键的同时按下鼠标左键时执行不同的代码。

private void treeList1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

    TreeList tree = sender as TreeList;

    if (e.Button == MouseButtons.Right && ModifierKeys == Keys.None && tree.State == TreeListState.Regular)
    
       //the code that is here gets executed 
       MessageBox.Show("I am here");
    

我将非常感谢任何提示或帮助。

附:在上述情况下,我想补充一点,当我检查 e.button 值时,它显示等于 Right,尽管我按下了鼠标左键和 Ctrl 键。这对我来说是个谜。

亲爱的 *** 研究员:我发现了问题,因为我在 MAC 上使用虚拟机,所以我不得不在我的虚拟机首选项上禁用一些键映射,现在我的原始代码可以工作了。感谢您的所有帮助。

【问题讨论】:

ModifierKeys 在调试时包含什么?很明显它不包含 Control。 这是 .net 4.0 吗?这可能会有所帮助:***.com/questions/4705428/… 事件按预期触发,您确定msgbox 代码被执行? @nzic 它包含控制 @retailcoder 它是 .net4 并且链接没有帮助。还是谢谢。 【参考方案1】:

问题在于 MAC 和我的 Windows 虚拟机之间有一个键映射需要禁用。感谢大家的帮助

【讨论】:

有趣。您是否颠倒了条件或诱捕Keys.None 有效? 还没试过,我会的,我一定会告诉你的。再次感谢。【参考方案2】:

Keys.None 的值为 0,单独使用时很难检测到“没有按下任何键”。这个:

    void Form1_MouseDown(object sender, MouseEventArgs e)
    
        if (e.Button == MouseButtons.Left && (ModifierKeys & Keys.None) == Keys.None)
        
            MessageBox.Show("No key was held down.");
        
    

无论组合键是什么,都会弹出一个消息框,只要用左键单击即可。

但是,这个:

    void Form1_MouseDown(object sender, MouseEventArgs e)
    
        if (e.Button == MouseButtons.Left && (ModifierKeys & Keys.Control) == Keys.Control)
        
            MessageBox.Show("Control key was held down.");
        
    

只有在按住Control 键(并单击鼠标左键)时才会弹出消息框。

尝试反转您的条件并检测单击时何时按下Control 键(而不是检测何时没有按下任何键)。话虽如此,由于某种原因,我很难让相同的代码与 Keys.ControlKeyKeys.LControlKey 一起使用,因此隔离左控制键需要更多研究。

【讨论】:

我试过你的第一盒代码,它不起作用。您能否编辑 e 之后需要的内容。也许我用错误的值填补了你的空白。所以,我仍然没有任何答案。仍然当我在按住 ctrl 的情况下单击鼠标左键时,它会执行鼠标右键单击的代码!我还没有试过你的第二个盒子。谢谢。 我试过这段代码(第二个代码块)——它有效!谢谢你,@Mat'sMug! :) 我有点晚了,但是因为 .Net 4.0(至少)枚举有 HasFlag 方法来检查是否设置了某些位。

以上是关于在 MouseDown 事件处理程序中检测 Ctrl+Left(鼠标按钮)的主要内容,如果未能解决你的问题,请参考以下文章

使用 StaticResource 和 MouseDown 处理程序时事件侦听器上的 Nullpointer 错误

为 .NET TextBox 捕获 MouseDown 事件

如何将事件处理程序分配给以编程方式创建的图片框

在没有 jQuery mobile 的移动设备上使用 mousedown 事件?

如何在初始 mousedown 事件后取消文本选择?

在 mousedown 事件中添加的 Mousemove 事件在鼠标不移动时不断触发