【问题标题】:Determine state of keyboard in non-keyboard-event method call在非键盘事件方法调用中确定键盘状态
【发布时间】:2009-04-16 20:41:49
【问题描述】:

在 textbox.TextChanged 事件中,如果仍然按住某个键,我想阻止执行某些特定(处理器密集型)功能。例如。当用户通过按住删除键删除大块文本时,如果仍然按住删除键,我想阻止代码触发。

我查看了Control.ModifierKeys,这是谷歌搜索最接近的东西,但在我的具体情况下,我想捕获是否按下了删除或退格键 - ModifierKeys 没有提供。

有人知道怎么做吗?理想情况下,我不必为每个文本框跟踪 keyup/keydown 的状态(尽管如果没有其他方法,我会这样做)

【问题讨论】:

    标签: c# winforms .net-2.0


    【解决方案1】:

    为什么不处理KeyUp event 而不是处理KeyPress。这样您就可以始终确定该键已经被按下并且正在被... errr.. 释放(因为没有更好的词!)

    【讨论】:

    • 这是一个想法,但最初我在文本框上挂钩 TextChanged 事件,因为它处理诸如剪切和粘贴之类的事情以及以编程方式更改的文本。
    【解决方案2】:

    如果您想知道当前的键盘状态(通过 KeyPreview),您不能在主窗体上附加事件。

    然后检查文本框事件处理程序中存储的状态。

    【讨论】:

      【解决方案3】:

      覆盖Control.ProcessKeyPreview 应该可以做到。

      【讨论】:

      • 我刚刚研究过这个,在这种情况下,我宁愿不必为了这个功能而对控件进行子类化。
      • 为什么这是个问题?如果 10 行额外的代码比解决你的问题更麻烦,那么还有更大的问题......
      【解决方案4】:

      最后我求助于外部函数GetKeyboardState

      所以为了将来参考,我正在做一些事情:

      [DllImport("user32.dll")] public static extern int GetKeyboardState(byte[] lpKeyState);
      
      private void myFunc()
      {
          byte[] keyboardState = new byte[255];
          int keystate = GetKeyboardState(keyboardState);
      
          if (keyboardState[(int)Keys.Back] == 128)
          {
             // backspace still pressed
             return;
          }
          else if (keyboardState[(int)Keys.Delete] == 128)
          {
             // Delete key still pressed
             return;
          }
      
          // More processor intensive code ...
      }
      

      我不确定函数调用开销,但我很确定它会小于函数不存在时执行的处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-28
        相关资源
        最近更新 更多