博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC++ 对话框程序响应键盘消息的处理方法的说明(非常重要)
阅读量:6037 次
发布时间:2019-06-20

本文共 1323 字,大约阅读时间需要 4 分钟。

基于MFC对话框的应用程序在响应按键消息和热键方面都力不从心,CDialog类的消息循环中去掉了TranslateAccelerator函数,因此不能响应热键;同时由于对话框上可能有很多控件,且默认情况下这些子窗口已经截获了焦点,因此键盘消息已经被控件捕获了;同时为了实现控件焦点切换和对话框默认行为,  VK_TAB、VK_LEFT、VK_RIGHT、VK_UP、VK_DOWN、 VK_RETURN、VK_ESCAPE 等键已经被截获处理,因此对话框没有控件时仍然不能完全响应按键消息。

    关于热键的响应请参考这篇文章:。
 
    那么我们怎么让对话框程序响应按键消息呢?答案就是重载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的说明。

转载于:https://www.cnblogs.com/lujin49/p/4934978.html

你可能感兴趣的文章
XCode工程中 Targets详解
查看>>
Ext.Msg.prompt的高级应用
查看>>
Postgres 中 to_char 格式化记录
查看>>
关于联合索引
查看>>
开源 java CMS - FreeCMS2.7 登录移动端管理中心
查看>>
Android FM模块学习之三 FM手动调频
查看>>
Python 设置系统默认编码以及其他编码问题大全
查看>>
Vbs脚本编程简明教程之十四
查看>>
如何UDP/TCP端口是否通了
查看>>
pxe实现系统的自动化安装
查看>>
Redis高可用技术解决方案总结
查看>>
Scale Out Owncloud 高可用(2)
查看>>
何为敏捷
查看>>
HA集群之四:Corosync+Pacemaker+DRBD实现HA Mysql
查看>>
服务器定义
查看>>
我的友情链接
查看>>
MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能
查看>>
c# 入门 例子
查看>>
HP Designjet 800PS 日常维护
查看>>
rhel7使用fdisk分区时无法使用全部分区的解决办法
查看>>