VC中鍵盤事件處理主要是通過對相應的消息的響應,這些事件有如:WM_CHAR、WM_KEYDOWN、WM_KEYUP等他們分別對應OnChar、OnKeyDown、OnKeyUp消息處理函數;當然在有些時候我們也可能需要用到對PreTranslateMessage函數的重載。
從這些事件的名稱我們可以看出WM_CHAR表示字符事件,WM_KEYDOWN表示鍵盤的鍵被按下時事件,而WM_KEYUP則表示鍵盤的鍵被放開時的事件;我們在鍵盤上按下某個鍵時系統先調用OnKeyDown函數接着調用OnChar函數最後調用OnKeyUp函數;這些消息函數的原形如下:
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
nChar代表虛擬鍵,nRepCnt代表重複次數;而對於nFlags則有點麻煩但大多數時候我們不管這個參數,nFlags的具體意義請參考MSDN相關文檔;nChar 代碼與鍵盤中各鍵的對應關係如下:
VK_0 到 VK_9 表示鍵盤上數字“ 0 ”到“ 9 ”鍵 (ASCII 碼爲 0x30 - 0x39) ;
VK_A 到 VK_Z 表示鍵盤上字母“ A ”到“ Z ”鍵 (ASCII 碼爲 0x41 - 0x5a) ;
VK_ADD 表示數字鍵盤上的“ + ”鍵。
VK_ALT 表示鍵盤上 “ ALT ”鍵。
VK_BACK_QUOTE 表示鍵盤上 “ ` ”鍵。
VK_BACK_SLASH 表示鍵盤上 “ / ”鍵。
VK_BACK_SPACE 表示鍵盤上 “ BACKSPACE “鍵。
VK_CAPS_LOCK 表示鍵盤上 “ CAPS LOCK ”鍵。
VK_CLOSE_BRACKET表示鍵盤上 “ ] ”鍵。
VK_COMMAN 表示鍵盤上 “ , ”鍵。
VK_CONTROL 表示鍵盤上 “ CTRL ”鍵。
VK_DECIMAL 表示數字鍵盤上 “ . ”鍵。
VK_DELETE 表示鍵盤上 “ DELETE ”鍵。
VK_DIVIDE 表示鍵盤上 “ / ”鍵。
VK_DOWN 表示鍵盤上 “向下箭頭”鍵。
VK_END 表示鍵盤上 “ END ”鍵。
VK_ENTER 表示鍵盤上 “ ENTER ”鍵。
VK_EQUALS 表示鍵盤上 “=”鍵。
VK_ESCAPE 表示鍵盤上 “ ESC ”鍵。
VK_F1 到 VK_F12 表示鍵盤上 “ F1 ”到“ F12 ”鍵。
VK_HOME 表示鍵盤上 “ HOME ”鍵。
VK_INSERT 表示鍵盤上 “ INSTERT ”鍵。
VK_LEFT 表示鍵盤上 “向左箭頭”鍵。
VK_MULTIPLY 表示鍵盤上 “ * ”鍵。
VK_NUMPAD0 到 VK_NUMPAD9 表示數字鍵盤上 “ 0 ”到“ 9 ”鍵。
VK_OPEN_BRACKET 表示鍵盤上 “ [ ”鍵。
VK_PAGE_DOWN 表示鍵盤上 “ PAGE DOWN ”鍵。
VK_PAGE_UP 表示鍵盤上 “ PAGE UP ”鍵。
VK_PAUSE 表示鍵盤上 “ PAUSE ”鍵。
VK_PRINTSCREEN 表示鍵盤上 “ PRINT SCREEN ”鍵。
VK_RIGHT 表示鍵盤上 “向右箭頭”鍵。
VK_SCROLL_LOCK 表示鍵盤上 “ SCROLL LOCK ”鍵。
VK_SEMICOLON 表示鍵盤上 “;”鍵。
VK_SHIFT 表示鍵盤上 “ SHIFT ”鍵。
VK_SPACE 表示鍵盤上 “ SPACEBAR ”鍵。
VK_SUBTRACT 表示鍵盤上 “-”鍵。
VK_TAB 表示鍵盤上 “ TAB ”鍵。
VK_UP 表示鍵盤上 “向上箭頭”鍵。
例子如下:
- void CTestCharDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
- {
- // TODO: Add your message handler code here and/or call default
- switch(nChar)
- {
- case VK_LEFT://按下左鍵
- DealLeft();
- break;
- case VK_RIGHT://按下右鍵
- DealRight();
- break;
- case VK_UP://按下上鍵
- DealUp();
- break;
- case VK_DOWN:// 按下下鍵
- DealDown();
- break;
- default:
- break;
- }
- CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
- }
在大多數時候我們只要用到OnChar、OnKeyDown、OnKeyUp這些消息處理函數就夠了,但有時候我們會發理這些函數並不會被調用(特別是對話框程序)這時我們就必需去重載PreTranslateMessage函數;些函數的使用也比較簡單但在處理組合按鍵時我們必需用到相關的輔助API,這些API有GetKeyState、GetKeyboardState等;這些輔助API的功能是獲取相應鍵的當前狀態(具體說明請參見MSDN文檔);PreTranslateMessage例子如下:
- BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
- {
- // TODO: Add your specialized code here and/or call the base class
- //判斷是否是按鍵消息
- if( pMsg->message == WM_KEYDOWN )
- {
- int nTmp;
- SHORT nVK;
- //獲取左Ctrl鍵狀態
- nVK = GetKeyState( VK_LCONTROL );
- nVK = nVK & 0xff00;
- //判斷具體鍵
- switch( pMsg->wParam )
- {
- case VK_LEFT://按下左鍵
- if ( nVK == 0 )
- {
- AdjustDestRect( -1, 0 );
- }else
- {
- AdjustLeftMid( -1 );
- }
- //消息到些結束,不要再向別的地方發送
- return TRUE;
- break;
- case VK_RIGHT://按下右鍵
- if ( nVK == 0 )
- {
- AdjustDestRect( 1, 0 );
- }else
- {
- AdjustRightMid( 1 );
- }
- break;
- case VK_UP://按下上鍵
- if ( nVK == 0 )
- {
- AdjustDestRect( 0, -1 );
- }else<, /SPAN>
- {
- AdjustTopMid( -1 );
- }
- break;
- case VK_DOWN://按下下鍵
- if ( nVK == 0 )
- {
- AdjustDestRect( 0, 1 );
- }else
- {
- ADjustButtonMid( 1 );
- }
- break;
- default:
- break;
- }
- }
- return CDialog::PreTranslateMessage(pMsg);
- }