2013-08-05 49 views
2

http://www.quirksmode.org/dom/events/keys.html:當用戶按下一個鍵WinForms中缺少VM_KEYPRESS?

的keydown 火災。它在用戶保持按下的狀態下重複。

keypress 將實際字符插入到文本輸入中時觸發。它在用戶保持按下的狀態下重複。

keyup 在用戶釋放密鑰後觸發,在該密鑰的默認操作完成後執行。

C#API:http://msdn.microsoft.com/en-us/library/ff468861(v=vs.85).aspx

KEYUPKEYDOWN

我的問題:爲什麼沒有按鍵的十六進制代碼的C#API中存在嗎?

+0

可能是因爲在大多數情況下,按鍵和WM_KEYDOWN之間幾乎沒有區別。 – James

回答

1

因爲它是在keydown的消息中處理的。 KEYDOWN的文檔說明了前16位:

當前消息的重複計數。該值是由於用戶按下鍵而導致擊鍵被自動重複執行的次數。如果按鍵持續時間足夠長,則會發送多條消息。但是,重複計數不是累積的。

因此,如果前16位大於0,那麼您的標誌爲KEYPRESS

爲什麼它不是一個單獨的標誌的確切原因是我不知道的。

+0

換句話說,我需要發送多個KEYDOWNs來模擬按鍵? – Johan

+1

我從來沒有嘗試過,但文檔確實似乎暗示了它。你也可能想檢查保存前一個關鍵狀態的第30個字節。但是這又會提示多個KEYDOWNs ... – Jordy

+1

我認爲你的意思是* bits *? – KappaG3

1

爲什麼沒有按鍵的十六進制代碼存在

我認爲你是在談論Windows消息。它確實存在,它只是沒有命名任何接近「按鍵」的東西。這是WM_CHAR message。它在C#應用程序中生成KeyPress事件。商店應用中更好的匹配名稱,即CoreWindow.CharacterReceived事件。

給出一些背景,這個消息是由TranslateMessage()winapi函數生成的。您在消息循環中調用的函數。它需要一個WM_KEYDOWN消息並從中合成WM_CHAR消息。可以有任何地方從0到幾個。做這種翻譯的功能也暴露出來,它是ToUnicodeEx()。請注意,虛擬鍵碼,掃描碼,當前鍵盤狀態和活動鍵盤佈局需要如何才能完成工作。鍵盤狀態非常重要,因此在按住Shift鍵的同時您可以看到不同的字符。鍵盤佈局是Windows如何支持不同的語言,並使用相同的虛擬鍵碼生成完全不同的打字字符。

永遠不要假設你可以自己合成KeyDown事件中的鍵入字符,但不能準確無誤。某些鍵盤佈局上的死鍵無法正確處理,您無法獲得另一個進程的鍵盤狀態。