如何在 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 中检测多个修改按钮和按下的字符的主要内容,如果未能解决你的问题,请参考以下文章
android listview 如何实现这种圆角和按下的效果,送分题又来了,求高手快来拿分