VC++ 对话框程序响应键盘消息的处理方法的说明(非常重要)
2015-11-04 08:58
781 查看
基于MFC对话框的应用程序在响应按键消息和热键方面都力不从心,CDialog类的消息循环中去掉了TranslateAccelerator函数,因此不能响应热键;同时由于对话框上可能有很多控件,且默认情况下这些子窗口已经截获了焦点,因此键盘消息已经被控件捕获了;同时为了实现控件焦点切换和对话框默认行为, VK_TAB、VK_LEFT、VK_RIGHT、VK_UP、VK_DOWN、 VK_RETURN、VK_ESCAPE 等键已经被截获处理,因此对话框没有控件时仍然不能完全响应按键消息。
关于热键的响应请参考这篇文章:Keyboard messages/accelerators handling in MFC dialog based applications。
那么我们怎么让对话框程序响应按键消息呢?答案就是重载PreTranslateMessage,在其中截获键盘消息进行处理。
与按键相关的消息大概有4个:WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、WM_SYSKEYUP,需要说明的包括以下几点:
1、KEY与SYSKEY消息的区别在于:如果某个按键动作的同时,ALT键或F10键被按下,则发送SYSKEY消息,否则发送KEY消息;
2、某个按键动作依次产生WM_KEYDOWN和WM_KEYUP消息;
3、一个按键一直按着不放,会按一定间隔时间不断发送WM_KEYDOWN消息;
4、单键动作最好响应WM_KEYUP,组合键动作响应WM_KEYDOWN或WM_SYSKEYDOWN;
关于几个按键消息的具体解释,请参考MSDN。
以下是一个响应单键消息的示例代码:
那么怎样判断组合键呢?使用GetKeyState函数。示例代码如下:
另外,还有GetAsyncKeyState和GetKeyboardState等类似函数,涉及到逻辑按键和物理按键值等问题,大家可以参考MSDN的说明。
关于热键的响应请参考这篇文章:Keyboard messages/accelerators handling in MFC dialog based applications。
那么我们怎么让对话框程序响应按键消息呢?答案就是重载PreTranslateMessage,在其中截获键盘消息进行处理。
与按键相关的消息大概有4个:WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、WM_SYSKEYUP,需要说明的包括以下几点:
1、KEY与SYSKEY消息的区别在于:如果某个按键动作的同时,ALT键或F10键被按下,则发送SYSKEY消息,否则发送KEY消息;
2、某个按键动作依次产生WM_KEYDOWN和WM_KEYUP消息;
3、一个按键一直按着不放,会按一定间隔时间不断发送WM_KEYDOWN消息;
4、单键动作最好响应WM_KEYUP,组合键动作响应WM_KEYDOWN或WM_SYSKEYDOWN;
关于几个按键消息的具体解释,请参考MSDN。
以下是一个响应单键消息的示例代码:
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) { if(pMsg->message == WM_KEYUP) { // 响应keyup消息 if(pMsg->wParam == VK_RETURN) { // 回车 } } return CDialog::PreTranslateMessage(pMsg); }
那么怎样判断组合键呢?使用GetKeyState函数。示例代码如下:
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) { if(pMsg->message == WM_KEYDOWN) { // 组合键响应keydown消息 if( pMsg->wParam == VK_SPACE&& (GetKeyState(VK_SHIFT)& 0x8000)) { // 空格 + Shift } } else if(pMsg->message == WM_SYSKEYDOWN) { // Alt组合键响应syskeydown消息 if( pMsg->wParam == 'A'&& (HIWORD(pMsg->lParam) & KF_ALTDOWN)) { // A + Alt } } return CDialog::PreTranslateMessage(pMsg); }
另外,还有GetAsyncKeyState和GetKeyboardState等类似函数,涉及到逻辑按键和物理按键值等问题,大家可以参考MSDN的说明。
相关文章推荐
- 搭建C语言开发环境(Windows平台)汇总
- C/C++高阶语法:函数指针及其应用,回调函数
- ——黑马程序员——C语言中构造类型—结构体(二)
- c++ read
- 在Windows平台搭建C语言开发环境的多种方式
- C++除法实现方式及负数取模
- 对字符串中的字符进行统计
- c++11特性之std::thread--进阶二
- c++11特性之std::thread--进阶二
- leetcode笔记:House Robber II
- 高质量程序设计指南C++/c语言 第四章
- [转]VC++中CTime类Format参数详解
- c++11特性之std::thread--进阶
- c++11特性之std::thread--进阶
- C++搜索引擎—Xapian中文简介
- C++: 类(class) 随笔
- c++初始化列表
- C语言:判断一个字符串是否为另外一个字符串旋转之后的字符串。(左旋右旋、求子串)
- C语言:实现一个函数,可以左旋字符串中的k个字符。
- C语言:每瓶汽水1元,两个空瓶可以置换一瓶汽水,现在有20元,最多能喝多少瓶汽水。