离奇失踪的WM_HOTKEY消息--浅析WIN32消息队列
故事的开端有些平淡,眼红于XXX小程序,认为写完该程序就有了和心仪的妹子多相处的机会,必须搞,必须酷,按钮不能有,界面得隐藏,这就想到了全局快捷键。
注册调用RegisterHotKey(m_hWnd, 300, MOD_ALT, 'K');
定义消息处理函数 afx_msg long OnHotKey(WPARAM wparam, LPARAM lparam);
消息关联处理程序ON_MESSAGE(WM_HOTKEY, OnHotKey)
定义消息处理函数 ,switch(wparam)调用对应的函数处理。
测试了一下,一切OK,开始搜索其他API,埋头苦整,一番恶战终于搞定其他功能,开始登记其他快捷键并调用处理过程。OH SHIT!快捷键没效果了?难道是登记的快捷键冲突了?检查了RegisterHotKey的返回值,是正确的,那么登记快捷键肯定没问题!该怎么办呢?去查WIN32消息处理机制来解决问题吧
MFC总共有三种类型的消息:窗口、命令、控件通知,嗯,找找窗口消息是怎么处理的。
登记全局快捷键的原理解释是:某键被按下时,系统在所有的热键列表中寻找匹配者,匹配成功将WM_HOTKEY消息发送给登记了该热键的线程的消息处理队列。挠了挠脑袋,我认定WM_HOTKEY已经发送给指定的消息队列。
-----补充知识点,发送消息有两种形式:发送消息,即时到达并立马调用目标窗口的进程,目标窗口必须为调用函数返回一个结果才能继续;寄送消息,将消息加入目标进程的消息队列,应用程序有空闲时就会搜索消息队列,从消息队列中删除消息并将消息发送给指定窗口,通信可能延迟。鼠标和键盘消息由于其特殊性,采用寄送的方式处理,其他所有消息都是发送的方式。
到这里就有点悟了,敢情我定义的全局快捷键处理函数OnHotKey并不会直接被调用,大胆猜测一下:窗口进程从消息队列中取出寄送来的WM_HOTKEY消息后首先交给了窗口,而窗口线程收到WM_HOTKEY消息并没有按照我的意愿调用OhHotKey。再找一下窗口处理消息的机制。
寄送消息在被消息泵弹出之前会一直保留在消息队列中,直到应用程序调用GetMessage函数从消息队列中将之取出,取出后会调用PreTranslateMessage和TranslateMessage两个函数进行消息翻译,翻译后的消息通过DispatchMessage调用该消息预期的目标窗口进程。看到这里,不由得笑了,这可是大有玄机啊,GO ON!
PreTranslateMessage有点眼熟,果然从代码里找到这个知其然、不知其所以然的预处理函数。埋头继续查:绝大多数本窗口的消息都要经过PreTranslateMessage处理,如果想在MFC之前处理某消息,可以重载该函数,重点来了,只有经过消息队列的消息才会经过PreTranslateMessage处理,即时发送的消息或其他不经过消息队列的消息不会理睬该函数,联系前面的寄送消息方式,各位小看官都应该懂了,快捷键消息到了这里被截下来没有发送给预期的窗口处理函数。挖,还得挖,这个坑有点苗头了。
PretranslateMessage的定义和返回值仔细的看:是否调用TranslateMessage和DispatchMessage消息向指定窗口发送消息由PreTranslateMessage的返回值决定,当返回值为TRUE的时候,不回把消息发送给对应的窗口函数处理,这难道是真相?预处理消息的时候挖坑把WM_HOTKEY消息给埋起来了?修改代码,拦截到指定的消息后返回FALSE果然解决了问题。
随着真相的浮出水面,我又一次期待着想象中的其乐融融,加油,我会做一个颇具高手风范的tool。
离奇失踪的WM_HOTKEY消息--浅析WIN32消息队列的更多相关文章
- Win32消息机制
1. 消息机制 过程驱动:程序是按照我们预先定义好的顺序执行,每执行一步,下一步都已经按照预定的顺序继续执行,直到程序结束. 事件驱动:程序的执行顺序是无序的.某个时间点所执行的代 ...
- win32 消息说明
WM_NULL = $0000; WM_CREATE = $0001; 应用程序创建一个窗口 WM_DESTROY = $0002; 一个窗口被销毁 WM_MOVE = $0003; 移动一个窗口 W ...
- Win32消息循环机制等【转载】http://blog.csdn.net/u013777351/article/details/49522219
Dos的过程驱动与Windows的事件驱动 在讲本程序的消息循环之前,我想先谈一下Dos与Windows驱动机制的区别: DOS程序主要使用顺序的,过程驱动的程序设计方法.顺序的,过程驱动的程序有一个 ...
- Wpf发送接收 win32消息
#region WPF发送和接收win32消息 public const int WM_GETTEXT = 0x0D; public const int WM_SETTEXT = 0x0C; publ ...
- 收藏:Win32消息机制
Dos的过程驱动与Windows的事件驱动 在讲本程序的消息循环之前,我想先谈一下Dos与Windows驱动机制的区别: DOS程序主要使用顺序的,过程驱动的程序设计方法.顺序的,过程驱动的程序有一个 ...
- Win32 键盘事件 - 击键消息、字符消息、插入符号(光标)
注:以下内容为学习笔记,多数是从书本.资料中得来,只为加深印象,及日后参考.然而本人表达能力较差,写的不好.因非翻译.非转载,只好选原创,但多数乃摘抄,实为惭愧.但若能帮助一二访客,幸甚! 以下内容主 ...
- 【C#】分享一个可携带附加消息的增强消息框MessageBoxEx
--------------201507160917更新--------------- 无意中发现标准消息框在Windows7是有声音的,只是在Windows server 2008(R2)无声,而我 ...
- 深入探讨MFC消息循环和消息泵
首先,应该清楚MFC的消息循环(::GetMessage,::PeekMessage),消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情.在MFC ...
- java微信开发API解析(二)-获取消息和回复消息
java微信开发API解析(二)-获取消息和回复消息 说明 * 本演示样例依据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/20 ...
随机推荐
- scikit-learn:3.5. Validation curves: plotting scores to evaluate models
參考:http://scikit-learn.org/stable/modules/learning_curve.html estimator's generalization error can b ...
- 2015多校联合训练赛hdu 5301 Buildings 2015 Multi-University Training Contest 2 简单题
Buildings Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- html表格设计
html部分,biaoge.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- akka 原理分析优秀博客
http://www.nyankosama.com/2014/12/15/akka-source/ http://blog.csdn.net/aigoogle/article/details/4210 ...
- nyoj--914--Yougth的最大化(二分查找)
Yougth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最 ...
- FastJSON杂项
//通过TypeReference解决泛型的问题 List<Integer> rst = JSON.parseObject(v,new TypeReference<List<I ...
- Java事件处理机制2
实现一个小程序,怎样让小球受到键盘的控制,上下左右移动,如图: public class Demo3 extends JFrame{ MyPanel mp=null; public static vo ...
- rman备份工具简介
RMAN工具简介: 备份的文件: 数据文件 归档日志 控制文件(当前控制文件) spfile 自动管理备份相关元数据 文件名称 完成备份的scn 以数据块为单位,只备份使用过的数据块(物理层面判断是否 ...
- swift语言点评三 - Basic Operators
1.Tuples are compared from left to right, one value at a time, until the comparison finds two values ...
- Docker学习笔记(1)----认识Docker
1. 什么Docker? Docker是一个能把开发的应用程序自动部署到容器的引擎,它使用go语言编写的开源引擎,它在github上面个的地址为:https://github.com/docker/d ...