2009-04-16 40 views
0

的状态在textbox.TextChanged事件我想阻止执行如果一个关键仍按住一些特定的(处理器密集型)的功能。例如。而用户通过按住删除键删除大部分文本区域时,如果仍然按住删除键,我想防止代码被触发。确定键盘在非键盘事件的方法调用

我看着Control.ModifierKeys这是谷歌搜索最接近的事情,但在我的具体情况下,我想陷入如果删除或退格键被按下 - 哪些ModifierKeys没有提供。

有谁知道如何做到这一点?理想的情况是一些不涉及我不得不跟踪KEYUP/KEYDOWN的状态,对每一个文本框(但如果没有其他办法,我会那样做)

回答

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 ... 
} 

我不知道该函数调用的开销,但我敢肯定,它将低于功能将执行的处理,如果它不在那里。

1

为什么不处理KeyUp event,而不是处理KeyPress。这样,你总是可以肯定的是,密钥已经被按下,是被过程... errr ..释放(由于缺乏一个更好的词!)

+0

它的一个想法,但最初我钩住的文本框TextChanged事件,因为它的东西像科佩斯剪切和粘贴和文本编程改变。 – Ash 2009-04-16 10:40:21

0

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

然后核对从文本框事件处理程序的存储状态。

0

重写Control.ProcessKeyPreview应该这样做。

+0

我刚才看到了这个,在这种情况下,我宁愿不必为此功能而继承控件。 – Ash 2009-04-16 12:07:54