zoukankan      html  css  js  c++  java
  • 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,虚拟键码可以下面相关资料中查到)。

    参见: http://blog.sina.com.cn/s/blog_674aa7a70100j46q.html

  • 相关阅读:
    3d服务器配置
    Can't connect to postgres on centos with psycopg
    flask快速入门
    nohup: cannot run command “/bin/java”:
    linux 上redis的启动口令
    CentOS网络设置 couldn't resolve host 'mirrorlist.centos.org问题解决
    CentOS下使用Mysql
    解决nodejs跨域的一个中间件
    JS实现禁用滑动条但滑动条不消失的效果
    JQ实现下拉加载更多
  • 原文地址:https://www.cnblogs.com/huipengkankan/p/2184479.html
Copyright © 2011-2022 走看看