转载自:传送门

一:首先介绍键盘消息

系统消息:

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'就行了,主键盘上的数字键也是同理!

【转载】MFC键盘响应的更多相关文章

  1. MFC 键盘响应

    键盘响应 插入函数:在...对话框/menu中进入建立类模式,建立preTranslateMessage(MSG * pMsg) 在CXXXView类中,添加: BOOL CMy9_1View::Pr ...

  2. 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9327377 作者:七十一雾央 新浪微博:http:// ...

  3. mfc 鼠标、键盘响应事件

    一.基本目标 1.有一个基本的MFC程序,点击“关闭”则“关闭”这个程序,这点没什么好讲的,把自带的“取消”按钮,右键->属性的Caption改成“关闭”二字就可以了 2.鼠标在对话框中移动,则 ...

  4. MFC消息响应机制 q

    MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows ...

  5. 利用钩子函数来捕捉键盘响应的windows应用程序

    一:引言: 你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到 ...

  6. C# 键盘响应事件及键值对照表

    键盘响应事件总结 键盘响应事件是在用户按下某个键后触发的事件,可以是任意操作,但不是任意键都可以被捕获的. 原型:public event KeyPressEventHandler KeyPress ...

  7. 小胖说事22-----iOS开发技巧之取消键盘响应和截屏功能

    1.UILable内容模糊 在非Retina的iPad mini 的屏幕上,一个UILable的frame的origin值假设是有小数位(如0.5),就会造成显示模糊,所以不妨用整数值的origin. ...

  8. 关于c# winform 键盘响应右边键盘消息响应事件的上下左右方向键没有反应

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11835642.html 记录一下这个小坑,c# winform 键盘响应右边键盘的上下左右方向 ...

  9. MFC 对话框响应OnChar()

    最近在写程序时,出现了对话框里面不接收键盘消息的情况,特别搜索了以下内容 MFC中对话框是不会直接响应OnChar和OnKeyDown消息的,会被 其它控件拦截,测试时发现不会进入这两个函数,必须重定 ...

随机推荐

  1. 详解c++指针的指针和指针的引用

    展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方 ...

  2. 你真的熟悉background吗?

    一两个月没更新博客了,因为放假刚在深圳找了实习,一直都比较忙碌,不过我觉得再忙,还是需要时间去沉淀一些东西,工作的时候别人看到的只是你有没有实现最终的结果,但自己是否思考,是否去总结,决定着你工作是否 ...

  3. 通向高可扩展性之路(WhatsApp篇)---- 脸书花了190亿买来的WhatsApp的架构

    原文链接:http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-bill ...

  4. useradd 添加用户

    功能介绍 useradd命令用于Linux中创建的新的系统用户.useradd可用来建立用户帐号.帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号.使用useradd指令所建 ...

  5. Beta版本冲刺———第七天

    会议照片: 项目燃尽图: 1.项目进展: 明天就验收了,今天做的是对项目的所有功能进行复查(由郭怡锋和洪大钊负责); 对于新增的功能:排行榜和撤销一步依然没有做出来.

  6. Java--笔记(2)

    11.根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件: 1)互斥条件(Mutual ...

  7. re模块(正则表达式)

    re 模块:正则表达式import re 内置模块: 1> re.match(pattern,string) pattern:就是正则表达式 string:被操作的对象 match,search ...

  8. [转]Oracle中使用Rownum分页详细例子

    原文地址:http://www.jb51.net/article/52272.htm 在MySQL中,我们通常都使用limit来完成数据集获取的分页操作,而在Oracle数据库中,并没有类似limit ...

  9. [转]Filter实现处理中文乱码,转义html标签,过滤敏感词

    原文地址:http://www.cnblogs.com/xdp-gacl/p/3952405.html 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可 ...

  10. iOS开发小技巧--UIButton的另一种布局方法(第一种在layoutSubViews方法中,这一种利用苹果提供的两个返回CGRect的方法)