代码之家  ›  专栏  ›  技术社区  ›  Thomas

确定非键盘事件方法调用中键盘的状态

  •  0
  • Thomas  · 技术社区  · 16 年前

    在textbox.textChanged事件中,我希望在仍按住某个键的情况下阻止执行某些特定的(处理器密集型)功能。例如,当用户通过按住Delete键来删除大区域的文本时,我希望在仍然按住Delete键的情况下防止代码触发。

    我看了看 Control.ModifierKeys 这是最接近谷歌搜索启动的事情,但在我的具体情况下,我想陷阱如果删除或退格键被按下-这是修改键不提供。

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

    4 回复  |  直到 16 年前
        1
  •  1
  •   Cerebrus    16 年前

    为什么不处理 KeyUp event 而不是处理 KeyPress . 这样你就可以一直确保钥匙已经被按下,并且正在被…错误…发布(因为没有更好的词!)

        2
  •  0
  •   Simeon Pilgrim    16 年前

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

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

        3
  •  0
  •   leppie    16 年前

    压倒一切 Control.ProcessKeyPreview 应该这样做。

        4
  •  0
  •   Thomas    16 年前

    最后我求助于外部功能 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 ...
    }
    

    我不确定函数调用开销,但我很确定如果函数不在那里,它将比函数执行的处理要少。

    推荐文章