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

时间:2009-04-16 10:28:55

标签: c# winforms .net-2.0

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

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

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

4 个答案:

答案 0 :(得分:1)

为什么不处理KeyUp event而不是处理KeyPress。这样你就可以确保钥匙已被压下,并且正在......错误...被释放(因为没有更好的词!)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

覆盖Control.ProcessKeyPreview应该这样做。

答案 3 :(得分:0)

最后,我采用了外部函数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 ...
}

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