• 【转载】MFC键盘响应


    转载自:传送门

    一:首先介绍键盘消息

    系统消息:

    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                7 E                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,虚拟键码可以下面相关资料中查到)。

    另外需要注意:

    VK_?? 定义在 winuser.h 中,而对于字母123...,ABC..却没有VK_A,VK_B...
    MFC中恰恰没有VK_0 -- VK_9,VK_A --VK_Z ,倒是有VK_NUMPAD0 --VK_NUMPAD9
    在delphi,BCB,JAVA中都有。
    当然,你可以直接定义,但是打开winuser.h会找到:

    所以直接用'A'就行了,主键盘上的数字键也是同理!

  • 相关阅读:
    linux文件编辑VI命令详解
    超级方便的linux命令手册
    查看两个集合中有没有相同的元素的方法。Collections disjoint
    list集合的遍历3种方法
    优秀的linux学习网站
    Linix CentOS6.5 下载安装图解(转)
    创建本地yum软件源,为本地Package安装Cloudera Manager、Cloudera Hadoop及Impala做准备
    VBA小记
    JSON FILE NOT FOUND?
    WPF之Binding【转】
  • 原文地址:https://www.cnblogs.com/ZhaoxiCheung/p/5538861.html
Copyright © 2020-2023  润新知