2009-06-18 96 views
1

我需要捕獲來自楔形設備的關鍵幀並阻止任何控件或表單接收它們。我也需要能夠知道值(char)。我嘗試覆蓋ProcessCmdKey(Keys)和ProcessDialogChar(char)事件。在ProcessCmd事件中,如果它是我想要的一個,我可以禁止擊鍵,但是我不是該事件的參數。在ProcessDialogChar事件中,角色在那裏,但是我無法阻止表單或焦點控件接收密鑰。建議?捕獲擊鍵

回答

1

這不是我想要做到這一點,而是因爲我需要解決這個問題並繼續前進,我在窗體上放置了一個隱藏文本框,並且只要我看到指示數據字符串可能開始的字符我想捕捉我將焦點設置到該文本框並響應TextChanged事件。如果我在計時器到期前沒有看到結尾字符,我將清除文本框並重新開始。 Kludge,但它工作,讓我接下來的任務。

5

你要窗體加載過程中添加此:

Application.AddMessageFilter(this); 

添加這個常數:

private const int WM_KEYDOWN = 0x100; 

而且這種方法:

public bool PreFilterMessage(ref Message m) 
{ 
    Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode; 
    bool retVal = false; 

    if (m.Msg == WM_KEYDOWN) 
    { 
     // Handle the keypress 
     retVal = true; 
    } 

    return retVal; 
} 

通過返回true,表單和控制(s)永遠不會看到按鍵。

+0

兩件事情我沒有說清楚:你需要實現IMessageFilter,它有一個方法PreFilterMessage。實際上,您不必在表單上實現此功能,如果您希望實現此界面,則可以創建完全獨立的對象。雖然我不確定,但是在創建表單之前應該能夠調用AddMessageFilter,因爲消息過濾器屬於GUI線程的消息泵。 – jasonh 2009-06-19 00:52:39