VC處理鍵盤按鍵消息

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                       表示鍵盤上 “向上箭頭”鍵。

例子如下:

  1. void CTestCharDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)   
  2. {  
  3.        // TODO: Add your message handler code here and/or call default  
  4.        switch(nChar)   
  5.        {   
  6.        case VK_LEFT://按下左鍵  
  7.               DealLeft();  
  8.               break;       
  9.        case VK_RIGHT://按下右鍵  
  10.               DealRight();  
  11.               break;   
  12.        case VK_UP://按下上鍵  
  13.               DealUp();  
  14.             break;   
  15.        case VK_DOWN:// 按下下鍵  
  16.               DealDown();  
  17.             break;   
  18.        default:   
  19.   
  20.               break;   
  21.        }  
  22.        CDialog::OnKeyDown(nChar, nRepCnt, nFlags);  
  23. }  

在大多數時候我們只要用到OnChar、OnKeyDown、OnKeyUp這些消息處理函數就夠了,但有時候我們會發理這些函數並不會被調用(特別是對話框程序)這時我們就必需去重載PreTranslateMessage函數;些函數的使用也比較簡單但在處理組合按鍵時我們必需用到相關的輔助API,這些API有GetKeyState、GetKeyboardState等;這些輔助API的功能是獲取相應鍵的當前狀態(具體說明請參見MSDN文檔);PreTranslateMessage例子如下:

  1. BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)   
  2. {  
  3.        // TODO: Add your specialized code here and/or call the base class  
  4.        //判斷是否是按鍵消息  
  5.        if( pMsg->message == WM_KEYDOWN )  
  6.        {  
  7.               int nTmp;  
  8.               SHORT nVK;  
  9.               //獲取左Ctrl鍵狀態  
  10.                  nVK = GetKeyState( VK_LCONTROL );  
  11.               nVK = nVK & 0xff00;  
  12.               //判斷具體鍵  
  13.               switch( pMsg->wParam )  
  14.               {   
  15.               case VK_LEFT://按下左鍵  
  16.                      if ( nVK == 0 )  
  17.                      {  
  18.                             AdjustDestRect( -1, 0 );  
  19.                      }else  
  20.                      {  
  21.                             AdjustLeftMid( -1 );  
  22.                      }  
  23.                      //消息到些結束,不要再向別的地方發送  
  24.                      return TRUE;  
  25.                      break;   
  26.               case VK_RIGHT://按下右鍵  
  27.                      if ( nVK == 0 )  
  28.                      {  
  29.                             AdjustDestRect( 1, 0 );  
  30.                      }else  
  31.                      {  
  32.                             AdjustRightMid( 1 );  
  33.                      }  
  34.                      break;   
  35.               case VK_UP://按下上鍵  
  36.                      if ( nVK == 0 )  
  37.                      {  
  38.                             AdjustDestRect( 0, -1 );  
  39.                      }else<, /SPAN>  
  40.                      {  
  41.                            AdjustTopMid( -1 );  
  42.                      }  
  43.                      break;   
  44.               case VK_DOWN://按下下鍵  
  45.                      if ( nVK == 0 )  
  46.                      {  
  47.                             AdjustDestRect( 0, 1 );  
  48.                      }else  
  49.                      {  
  50.                             ADjustButtonMid( 1 );  
  51.                      }  
  52.                      break;   
  53.               default:   
  54.                      break;   
  55.               }  
  56.        }  
  57.        return CDialog::PreTranslateMessage(pMsg);  
  58.   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章