如何在 VB.NET 中检测多个修改按钮和按下的字符

Posted

技术标签:

【中文标题】如何在 VB.NET 中检测多个修改按钮和按下的字符【英文标题】:How to detect multiple modifier buttons and character pressed in VB.NET 【发布时间】:2016-01-05 16:28:40 【问题描述】:

在一个 VB.NET 项目中(在 VS2013 中工作),当用户按下 CTRL + LEFT SHIFT + M 时,我需要做一些事情。

我得到的最接近的是能够检测到一个修饰键和 M 键。

有this question here in SO,但提供的示例代码的唯一答案是检测字符键和一个或另一个修饰键,而不是两者。

我一直在寻找一段时间,我看到的唯一示例显示只检测到一个修饰键,我不知道如何检测两个修饰键和一个字符键。

这是我目前拥有的代码:

If My.Computer.Keyboard.CtrlKeyDown AndAlso My.Computer.Keyboard.ShiftKeyDown AndAlso (e.KeyCode And Not Keys.Modifiers) = Keys.M Then
    HideForm()
End If

看起来在 KeyDown 事件中只检测到一个键,我猜这是有道理的,因为该事件将为每个键单独触发。

那么如何检测三个键都被按下的时间呢?

【问题讨论】:

If e.Control AndAlso e.Shift AndAlso e.KeyCode = Keys.M Then 不,不是,拉尔斯。 :( 在 KeyDown 事件中,它只检测被按下的第一个键。因此,如果我执行 CTRL + SHIFT + M 它只会获得 CRTL(e.Control 对于您的代码是正确的),如果我执行 SHIFT + CTRL + M然后它只是获取 shift 键(e.Shift 为真)。 只是为了澄清:它不可能(有意义地)调试 KeyDown 事件处理程序,因为它总是会在第一次按键时中断 【参考方案1】:

尝试在您正在使用的表单上使用 ProcessCmdKey 覆盖:

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
  If keyData = (Keys.Control Or Keys.Shift Or Keys.M) Then
    ' do something
    Return True
  End If
  Return MyBase.ProcessCmdKey(msg, keyData)
End Function

【讨论】:

宾果游戏!做到了。谢谢,拉斯。 我会很感激解释为什么在这里需要覆盖 ProcessCmdKey 并且 KeyDown/PreviewKeyDown 不起作用 @AlexB。 ProcessCmdKey 发生在表单上的任何其他内容之前。不知道为什么 KeyPreview = true 对您不起作用,但 KeyPreview 是 VB6 时代的旧保留。 该死,我想我忘了告诉 @marky 关于设置 KeyPreview=true ;) 感谢您的澄清 我确实将表单的 KeyPreview 属性设置为 True,所以和你们两个一样,我不确定为什么最初建议的解决方案不起作用...

以上是关于如何在 VB.NET 中检测多个修改按钮和按下的字符的主要内容,如果未能解决你的问题,请参考以下文章

Unity UGUi 怎么判断 点击按钮的抬起和按下

在vb net中,如何猎取和修改已选定的某一项的值?

android listview 如何实现这种圆角和按下的效果,送分题又来了,求高手快来拿分

如何检测按下的按钮并将其显示在另一个视图上? Objective-C

如何修改 vb.net 中禁用按钮的外观?

vb.net中怎么解决截取tab按下的事件