比較WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、WM_SYSKEYUP與WM_CHAR


前一陣子寫程序的時候,發現了WM_KEYDOWN使用虛擬鍵碼,完全可以知道響應的是什么字母鍵。當按下字母鍵“A”的時候,我們知道WM_KEYDOWN的wParam消息參數就可以知道是什么虛擬鍵碼,這里wParam是“0x41”.如果想輸入大寫字母A, 我們完全可以使用GetKeyState(VK_SHIFT)和GetKeyState(VK_CAPITAL)來判斷時候輸入的是否是大寫字母,然后通過ASCII中大小寫之間相差0x16來進行轉換。


但是Windwos消息響應中為什么還要添加WM_CHAR呢?這不在一定范圍內重復了么。一般我們用WM_KEYDOWN種處理具有非打印鍵的消息, 而使用WM_CHAR中處理可打印字符消息。但是KEYDOWN完全可以替代WM_CHAR,只是處理起來相對復雜一些而已,不過我們完全可以寫一套自己的庫來處理相關的情況,而放棄WM_CHAR。


上網查了一下,很多程序員認為WM_CHAR和WM_KEYDOWN的差別在於:如果分別按下“q”和“shift+q”,發出的WM_KEYDOWN消息都是代表q鍵,而發出的WM_CHAR消息分別是“q”和“Q” 。但是二者區別用意真正在於當你遇到國際鍵盤之間的差異的話,WM_CHAR和WM_KEYDOWN所產生的結果就不一樣了。如果您得到wParam等於0x33的WM_KEYDOWN消息,您就可以知道使用者按下了鍵3,到此為止一切正常。這時,如果用GetKeyState發現Shift鍵被按下,您就可能會認為使用者輸入了#號,這可不一定。比如英國使用者就是在輸入£。(注:TranslateMessage函數就是將按鍵消息轉換為字符消息。如果消息為WM_KEYDOWN或者WM_SYSKEYDOWN,並且按鍵與位移狀態相組合產生一個字符,則TranslateMessage把字符消息放入消息佇列中。)


不同鍵盤之間的差別,Windows給我們做了很好的解決方案了,我們為什么還要根據不同的鍵盤來確定WM_KEYDOWN結果呢。


至於WM_KEYDOWN和WM_KEYUP之間的區別就很容易區別了,一個是鍵的按下,一個是鍵的釋放。而WM_SYSKEYDOWN與WM_KEYDOWN的區別在於WM_SYSKEYDOWN和WM_SYSKEYUP消息經常由與Alt相組合的按鍵產生,這些按鍵啟動程序菜單或者系統菜單上的選項,或者用於切換活動窗口等系統功能(Alt-Tab或者Alt-Esc),也可以用作系統菜單加速鍵(Alt鍵與一個功能鍵相結合,例如Alt-F4用於關閉應用程序)。程序通常忽略WM_SYSKEYUP和WM_SYSKEYDOWN消息,並將它們傳送到DefWindowProc。由於Windows要處理所有Alt鍵的功能,所以您無需攔截這些消息。您的窗口消息處理程序將最后收到關於這些按鍵結果(如菜單選擇)的其它消息。如果您想在自己的窗口消息處理程序中加上攔截系統按鍵的程序碼,那么在處理這些消息之后再傳送到DefWindowProc,Windows就仍然可以將它們用於通常的目的。當然我們完全可以在響應WM_KEYDOWN和WM_KEYUP消息的lParam參數時,判斷第29位來判斷Alt鍵是否按下,如果在按鍵的時候同時按下ALT鍵,那么該位為1, 否則為0;或者通過GetKeyState(VK_MENU)來判斷ALT也是可以的哦。

 

來源:http://www.cppblog.com/xiwrong/archive/2010/12/26/137517.aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM