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 代码与键盘中各键的对应关系如下:

取值(16进制) 常量符号 含义
01 VK_LBUTTON 鼠标左键
02 VK_RBUTTON 鼠标右键
03 VK_CANCEL Break中断键
04 VK_MBUTTON 鼠标中键
05-07 -- 未定义
08 VK_BACK (BackSpace)键
09 VK_TAB Tab键
0A-0B -- 未定义
0C VK_CLEAR Clear键
0D VK_RETURN Enter键
0E-0F -- 未定义
10 VK_SHIFT Shift键
11 VK_CONTROL Ctrl键
12 VK_MENU Alt键
13 VK_PAUSE Pause键
14 VK_CAPTIAL CapsLock键
15-19 -- 汉字系统保留

1A -- 未定义
1B VK_ESCAPE Esc键
1C-1F -- 汉字系统保留
20 VK_SPACE 空格键
21 VK_PRIOR PageUp键
22 VK_NEXT PageDown键
23 VK_END End键
24 VK_HOME Home键
25 VK_LEFT ←(Left Arrow)键
26 VK_UP ↑(Up Arrow)键
27 VK_RIGHT →(Right Arrow)键
28 VK_DOWN ↓(Down Arrow)键
29 VK_SELECT Select键
2A -- OEM保留
2B VK_EXECUTE Execute键
2C VK_SNAPSHOT Print Screen键
2D VK_INSERT Insert键
2E VK_DELETE Delete键
2F VK_HELP Help键
30-39 VK_0-VK_9 数字键0-9
3A-40 -- 未定义
41-5A VK_A-VK_Z 字母键A-Z
5B-5F -- 未定义
60-69 VK_NUMPAD0-VK_NUMPAD9 小键盘数字键0-9
6A VK_MULTIPLY *(乘号)键
6B VK_ADD +(加号)键
6C VK_SEPAPATOR 分隔符键
6E VK_SUBTRACT -(减号)键
6F VK_DECIMAL .(小数点)键
70-87 VK_DIVIDE /(除号)键
88-8F VK_F1-VK_F24 F1-F24功能键
90 VK_NUMBERLOCK Number lock键
91 VK_SCROLL Scroll lock键
92-B9 -- 未定义
BA-C0 -- OEM保留
C1-DA -- 未定义
DB_E4 -- OEM保留
E5 -- 未定义
E6 -- OEM保留
E7-E8 -- 未定义
E9-F5 -- OEM保留
F6-FE -- 未定义


例子如下:

  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.   
  59. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值