2009-04-16 75 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