MFC 键盘响应

来源:互联网 发布:梦龙网络计划软件流水 编辑:程序博客网 时间:2024/04/29 22:50

一:首先介绍键盘消息
系统消息:
    ALT,F1,——F24等,是由系统内部处理的,程序本身就存在,比如F1是帮助键。
    WM_SYSKEYDOWN
    WM_SYSKEYUP
    WM_SYSCHAR
非系统消息:
    是由我们自己加上去的,
    WM_KEYDOWN
    WM_KEYUP
    WM_CHAR

 

二:然后介绍虚拟键代码


符号形式             十六进制形式        说明
VK_LBUTTON           01               鼠标左键
VK_RBUTTON           02               鼠标右键
VK_CANCEL              03               Control-break 过程
VK_MBUTTON           04               鼠标中键
VK_BACK                   08               BACKSPACE 键
VK_TAB                      09               TAB 键
VK_CLEAR                 0C               CLEAR 键
VK_RETURN              0D               ENTER 键
VK_SHIFT                  10               SHIFT 键
VK_CONTROL           11               CTRL 键
VK_MENU                  12               ALT 键
VK_PAUSE                13               PAUSE 键
VK_CAPITAL              14               CAPS LOCK 键
VK_ESCAPE              1B               ESC 键
VK_SPACE                 20               SPACEBAR
VK_PRIOR                  21               PAGE UP 键
VK_NEXT                    22               PAGE DOWN 键
VK_END                      23               END 键
VK_HOME                   24               HOME 键
VK_LEFT                     25               LEFT ARROW 键
VK_UP                         26               UP ARROW 键
VK_RIGHT                  27               RIGHT ARROW 键
VK_DOWN                  28               DOWN ARROW 键
VK_SELECT               29               SELECT 键
VK_EXECUTE            2B               EXECUTE 键
VK_SNAPSHOT        2C               PRINT SCREEN键(用于Windows 3.0及以后版本)
VK_INSERT               2D               INS 键
VK_DELETE              2E               DEL 键
VK_HELP                   2F               HELP键

VK_LWIN              5B               Left Windows 键 (Microsoft自然键盘)
VK_RWIN              5C               Right Windows 键 (Microsoft自然键盘)
VK_APPS              5D               Applications 键 (Microsoft自然键盘)
VK_NUMPAD0           60               数字小键盘上的 0 键
VK_NUMPAD1           61               数字小键盘上的 1 键
VK_NUMPAD2           62               数字小键盘上的 2 键
VK_NUMPAD3           63               数字小键盘上的 3 键
VK_NUMPAD4           64               数字小键盘上的 4 键
VK_NUMPAD5           65               数字小键盘上的 5 键
VK_NUMPAD6           66               数字小键盘上的 6 键
VK_NUMPAD7           67               数字小键盘上的 7 键
VK_NUMPAD8           68               数字小键盘上的 8 键
VK_NUMPAD9           69               数字小键盘上的 9 键
VK_MULTIPLY          6A               Multiply 键
VK_ADD               6B               Add键
VK_SEPARATOR         6C               Separator 键
VK_SUBTRACT          6D               Subtract 键
VK_DECIMAL           6E               Decimal 键
VK_DIVIDE            6F               Divide 键
VK_F1                70               F1 键
VK_F2                71               F2 键
VK_F3                72               F3 键
VK_F4                73               F4 键
VK_F5                74               F5 键
VK_F6                75               F6 键
VK_F7                76               F7 键
VK_F8                77               F8 键
VK_F9                78               F9 键
VK_F10               79               F10 键
VK_F11               7A               F11 键
VK_F12               7B               F12 键
VK_F13               7C               F13 键
VK_F14               7D               F14 键
VK_F15               7E               F15 键
VK_F16               7F               F16 键
VK_F17               80H              F17 键
VK_F18               81H              F18 键
VK_F19               82H              F19 键
VK_F20               83H              F20 键
VK_F21               84H              F21 键
VK_F22               85H              F22 键
VK_F23               86H              F23 键
VK_F24               87H              F24 键
VK_NUMLOCK           90               NUM LOCK 键
VK_SCROLL            91               SCROLL LOCK 键
VK_ATTN              F6               Attn 键
VK_CRSEL             F7               CrSel 键
VK_EXSEL             F8               ExSel 键
VK_EREOF             F9               Erase EOF 键
VK_PLAY              FA               Play 键
VK_ZOOM              FB               Zoom 键
VK_OEM_CLEAR         FE               Clear 键

 

三:OnKeyDown不响应的原因:
   

只是这个消息在到达窗体之前,已经被它的子控件捕获了,如果将窗体中的所有控件都删除,窗体就会捕获到这个消息,但要注意的是,MFC为了实现在窗体上切换子控件的焦点,已经将 VK_TAB,VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN进行了处理,同时VK_RETURN也被系统捕获用来处理相应的确定事件,所以即使窗体中没控件,这几个键还是无法捕获
    也就是说,一个窗体仅在它没有可视和有效的控件时,才能响应OnKeyDown。

四:具体的解决方法(按键响应方法)
    可以调用窗体的PreTranslateMessage函数来实现,具体代码如下:

 

BOOL CMeetingDlg::PreTranslateMessage(MSG* pMsg){if (pMsg->message==WM_KEYDOWN){   switch (pMsg->wParam)   {   case VK_F1:    if (::GetKeyState(VK_CONTROL)<0)    {     AfxMessageBox("ss");    }    break;   case VK_F2:    if (::GetKeyState(VK_CONTROL)<0)    {     AfxMessageBox("ss");    }    break;   }   }return CDialog::PreTranslateMessage(pMsg);}


***********************************************************************************

在MFC(Microsoft Foundation Class)对响应消息进行了封装,

可以通过重载虚函数PreTranslateMessage()对所关心的消息进行截取与响应:

以下对截取与响应键盘 Enter 消息的截取与响应

这是对话框的响应键盘 Enter 消息方式:

 

BOOL C**Dlg::PreTranslateMessage(MSG* pMsg){   //判断是否为键盘消息   if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST)   {      //判断是否按下键盘Enter键      if(pMsg->wParam==VK_RETURN)      {          return TRUE;      }   } return CDialog::PreTranslateMessage(pMsg);}


 

这是View视图类响应键盘 Enter 消息的方式:

 

BOOL C**View::PreTranslateMessage(MSG* pMsg){ if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST) {  if(pMsg->wParam==VK_RETURN )  {        return TRUE;    } } return CFormView::PreTranslateMessage(pMsg);} 

  在上面的代码中,首先将pMsg->message所表示的消息同WM_KEYFIRST 和WM_KEYLAST比较,确定是键盘消息,然后通过消息参数pMsg->wParam的值来判断是否是回车键(VK_RETURN,虚拟键码可以下面相关资料中查到)。

 原址:http://blog.sina.com.cn/s/blog_674aa7a70100j46q.html

 

 

原创粉丝点击