【问题标题】:keyboard events in .NET.NET 中的键盘事件
【发布时间】:2010-10-06 14:34:20
【问题描述】:

按键释放时触发按键事件。这适用于 a、b 等普通键。但是,按住箭头键或退出键会产生不同的结果。 不是在释放按键时触发按键向上事件,而是在按键按下事件后立即触发。因此,按住箭头键就等于非常快速地多次按下和释放该键。 任何解释和解决方法以确定何时实际释放密钥?

【问题讨论】:

    标签: c# vb.net forms keyboard


    【解决方案1】:

    在您释放键之前,实际上不会触发 KeyUp 事件(对于所有键,而不仅仅是箭头键等),只有许多重复的 KeyDown 事件。至少,从一些测试代码来看,我是这样看的。

    我的解决方法是在使用检测到 KeyDown 事件后禁用 KeyDown 处理程序

    RemoveHandler Me.KeyDown, AddressOf Form1_KeyDown
    

    然后在触发 KeyUP 事件时重新启用。

    AddHandler Me.KeyDown, AddressOf Form1_KeyDown
    

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

    【讨论】:

      【解决方案2】:

      我刚刚遇到了类似的问题。键盘处理程序的行为很奇怪:

      如果焦点和处理程序在文本框中:

      • 按住字母数字键时,我收到了多个 Press and 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        相关资源
        最近更新 更多