2009-02-10 103 views
2

键释放时触发按键事件。这适用于普通按键,如a,b等。然而,按住箭头键或退出键会产生不同的结果。 而不是在释放按键时触发按键事件,而是在按键事件之后立即触发事件。所以,按住一个箭头键变成等于非常快速地按压和释放该键多次。 任何解释和解决办法,以确定密钥何时实际发布?.NET中的键盘事件

回答

3

KeyUp事件实际上并没有被触发(对于所有的键不仅仅是方向键等),直到你释放键时,只有许多重复的KeyDown事件。至少,这是它从一些测试代码看待我的方式。

我的解决方法是使用

RemoveHandler Me.KeyDown, AddressOf Form1_KeyDown 

,然后重新启用时KeyUp事件被触发检测到KeyDown事件后禁用的KeyDown处理程序。

AddHandler Me.KeyDown, AddressOf Form1_KeyDown 

当然,如果你想同时处理多个按键,那么这是行不通的。您必须存储相关密钥是否已关闭,并忽略相应的KeyDown事件。

1

我刚刚遇到类似的问题。键盘处理行为怪异:

如果对焦和处理程序是在文本框:

  • 当字母数字键被按下,我得到了多个新闻Down事件
  • 箭头键和功能键产生多个Down事件

如果为启用KeyPreview的表单处理事件,则仅处理箭头键的KeyUp事件。

通过重写ProcessCmdKey可以处理较低级别的所有密钥。

如果你想处理一个左箭头键:

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean 
    Select Case keyData 
     Case Keys.Left 
      Debug.WriteLine("Left") 
      Return True 
     Case Else 
      Return MyBase.ProcessCmdKey(msg, keyData) 
    End Select 
End Function