基于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。
 
    以下是一个响应单键消息的示例代码:
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的说明。

VC++ 对话框程序响应键盘消息的处理方法的说明(非常重要)的更多相关文章

  1. mfc对话框不能响应键盘消息

    这东西真是奇怪,找了半天原因,最终的发现却是让人抓狂,呵呵 现象:对话框按ESC或回车都不能关闭窗口(我没有处理PreTransplanteMessage),用spy++看,对话框完全收不到键盘消息 ...

  2. [原]MFC中DIALOG(对话框)程序响应加速键(快捷键)

    [原]MFC中DIALOG(对话框)程序响应加速键(快捷键) 2014-8-6阅读266 评论0 新建一个对话框程序,项目名为Test,删除默认确定,取消和静态文本框控件.添加一个按钮,Caption ...

  3. VC 对话框程序加入工具栏button图标及其buttontooltip

    注意:本人使用VC++2010开发环境进行測试. 在使用VC开发对话框程序时不像开发单文档程序和多文档程序那么方便,非常多资源都须要自己手动加入.近期在开发一个程序时.想尝试在对话框程序里面加入 工具 ...

  4. vc对话框程序运行时隐藏

    1.在资源编辑中设置对话框为不可见 2.在OnPaint中加入下面代码 void CMyDlg::OnPaint() { static b = false; if(!b){ ShowWindow(SW ...

  5. Win32对话框模板创建的窗口上响应键消息,Tab焦点切换消息,加速键消息

    今天在学习的时候,发现对话框上不响应键盘消息,查了老半天,终于成功了,现分享出来, 1,首先要在消息循环的时候加如下代码. int WINAPI WinMain(_In_ HINSTANCE hIns ...

  6. VC对话框使用OnEraseBkgnd函数位图背景并透明

    1.使用OnEraseBkgnd函数实现对话框位图背景 BOOL CDisplayBmpBackGroundDlg::OnEraseBkgnd(CDC *pDC) { CRect rect; GetC ...

  7. 第六章 Windows应用程序对键盘与鼠标的响应 P121 6-8

    基于键盘与鼠标应用的程序设计 一.实验目的 1.掌握键盘与鼠标在应用程序中的消息响应机制.   二.实验内容及步骤 实验任务 1.熟悉键盘的消息响应: 2.熟悉鼠标的消息响应: 实验内容 设计一个窗口 ...

  8. VC++MFC对话框程序中给对话添加背景图片

    VC对话框怎么显示背景图片呢.在MFC中实现背景图片,不像C#应用程序那么简单.今天就和朋友们说说如何在VC界面中设置背景图片 ^_^   工具/原料 Visual C++ 2010 方法一:用Pic ...

  9. MFC模态对话框程序不响应OnIdle

    从代码分析原因吧: OnIdle函数在MFC的CWinThread::Run函数中被调用,如下 // main running routine until thread exits int CWinT ...

随机推荐

  1. 优先级反转实验,使用信号量实现【RT-Thread学习笔记 5】

    RTOS中很经典的问题.就是在使用共享资源的时候,优先级低的进程在优先级高的进程之前执行的问题.这里模拟这种情况. 下面的实验模拟了优先级反转的情况: 先定义三个线程: //优先级反转实验 rt_se ...

  2. Spring 事务注解 错误问题

    碰到个问题,在一个springmvc项目中,设置好事务,然后在service上添加@Transactional注解,只要一添加这个注解,该service就无法被spring创建成功, error cr ...

  3. Sybase

    Variable Naming Convention first character can be alphabetic character, _, @. Followed by alphabetic ...

  4. Conway's law(康威定律)

    Mel Conway  康威在加利福尼亚理工学院获得物理学硕士学位,在凯斯西储大学获得数学博士学位.毕业之后,他参与了很多知名的软件项目,如 Pascal 编辑器.在他的职业生涯中,康威观察到一个现象 ...

  5. Selenium WebDriver 之 PageObjects 模式 by Example

    目录 1. 项目配置 2. 一个WebDriver简单例子 3. 使用Page Objects模式 4. 总结 5. Troubleshooting 6. 参考文档 本篇文章通过例子来阐述一下Sele ...

  6. 【转】bind - DNS 設定

    http://www.l-penguin.idv.tw/article/dns.htm 參考資訊 DNS 是所有伺服之母,電腦連節時均以 IP 為主,比方說輸入 202.43.195.52 就會到台灣 ...

  7. ios 逆向收录

    lldb 远程调试环境搭建:http://www.cnblogs.com/csutanyu/p/3653252.html

  8. ThrottleAttribute

    /// <summary> /// Decorates any MVC route that needs to have client requests limited by time. ...

  9. cvs update后输出的文件标志 和 update常用的几个参数

    (1)update 和 checkout 在执行中,会为每个文件打印一行提示信息,文件的状态通过前面的单个字符指明:       U file        文件按要求从仓库得到更新.用在那些仓库里面 ...

  10. JAVA 多线程和并发学习笔记(四)

    1. 多进程 实现并发最直接的方式是在操作系统级别使用进程,进程是运行在它自己的地址空间内的自包容的程序.多任务操作系统可以通过周期性地将CPU从一个进程切换到另一个进程,来实现同时运行多个进程. 尽 ...