转载自:传送门

一:首先介绍键盘消息

系统消息:

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){
      <span class="hljs-keyword">return</span> <span class="hljs-keyword">TRUE</span>;}

}
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 ){
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">TRUE</span>;}

}
 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游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来

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

  2. MFC消息响应机制及映射机制理解

    一.MFC消息响应机制分析 ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了 ...

  3. iPhone和ipad键盘高度及键盘响应事件 摘

    iPhone和ipad键盘高度及键盘响应事件 http://blog.csdn.net/benbenxiongyuan/article/details/7892019 IPAD键盘高度: portra ...

  4. QT键盘响应卡顿的解决方法

    1.不要将事件在键盘响应事件中执行,应在键盘响应事件出设置布尔型变量. 例如: void Widget:: keyPressEvent(QKeyEvent *key)//检测键盘按下{Q_UNUSED ...

  5. mfc键盘控制移动鼠标光标_如何在Windows中使用键盘控制鼠标光标

    mfc键盘控制移动鼠标光标 If you're stuck without a mouse temporarily, don't worry-you can still use your PC. Yo ...

  6. 38 --> 详解 OpenWRT RESET按键、键盘响应逻辑

    OpenWrt 按键处理逻辑采用 hotplug 事件方式进行管理,reset按键,用来进行重启或者恢复出厂操作.热插拔事件流程:内核具有检测 键盘守护程序,gpio_button_hotplug 模 ...

  7. 【个人笔记】08 回调函数+键盘响应操作

    个人资料,仅供学习使用 学习课程:OpenCV4 C++ 快速入门视频30讲--贾志刚 08 回调函数+键盘响应操作 opencv知识点: 回调函数 - callback 键盘响应 - waitKey ...

  8. 键盘响应事件中的连按问题

    连按问题 在按键响应连按的时候遇到了一些问题 即重写了keyPressEvent(QKeyEvent *event)和keyPressRelease(QKeyEvent *event) 但是在具体使用 ...

  9. opencv快速入门—键盘响应操作

    贾志刚老师-opencv基于c++快速入门基础30讲 本节课程中主要讲解利用键盘实现图像处理过程的便捷操作,如:键盘按下1,图像变成灰度图像:键盘按下2,图像变成hsv色彩空间的图像:键盘按下3,图像 ...

最新文章

  1. ThinkPHP子类继承Controller类的注意事项
  2. 人脸识别数据集bin解压
  3. 实践中的电商前端优化
  4. 多线程爬虫python_一个简单的多线程Python爬虫
  5. 大叔公开课~微服务与持久集成
  6. 在C#中利用DirectX实现声音播放
  7. jQuery 中 data 方法的实现原理
  8. Selenium自动化测试-JavaScript定位
  9. 基于LD3320的嵌入式语音识别系统设计
  10. 劲爆!Java 通用泛型要来了。。
  11. linux kernel source code analysis
  12. Sql Server 2008完全卸载方法(其他版本类似)
  13. v5服务器装系统,小白必学:宏基V5-591G内存、固态、装系统教程!
  14. LPDDR4X与LPDDR4 区别 <转>
  15. 测试开发工程师必备技术栈(附详细技术点)
  16. autocomplete触发事件_如何防止onSelect事件在DevBridge jQuery Autocomplete中触发两次
  17. ios9提取安装包ipa_iOS获取ipa包以及图片资源
  18. 大数据平台的开发与思考一:
  19. 字节跳动为什么选用 Flutter : 可能成为不一样的未来 | 开发者说·DTalk
  20. Goland 代码飘红

热门文章

  1. Tomcat的安装与启动
  2. python将图片转动漫_如何将照片动漫化
  3. java怎么取随机数_java怎么产生随机数
  4. 汤姆计算机科技有限公司英语,关于计算机专业汤姆猫概述简介介绍的毕业设计论文英文英语外文文献翻译成品资料:Tomcat介绍(中英文双语对照).docx...
  5. (已解决)video标签在ios端默认全屏播放(h5开发)
  6. Orace登录及建库
  7. Java字符串转时间
  8. shell语法 函数
  9. 安卓开发中许多应用到的资源
  10. 在python中使用FP-growth算法