MFC消息截获之pretranslatemessage
来源:互联网 发布:js json对象 编辑:程序博客网 时间:2024/04/29 15:12
前几天,查了一个batch的问题,问题大致是这样,父窗口消息一个鼠标消息,弹出一个模态框,CPU负荷就飚升到100%(双核就是50%),非常怪异,用windbg,分析哪个线程占用CPU,定位到鼠标响应函数,也就是弹出模态框的函数,windbg提供的信息有限,只能自己分析,经过各种尝试,发现与模态框里面的控件无关,所以应该还是父窗口的问题,仔细看了下父窗口的代码,发现父窗口为了截获F1按下的消息,而重载了Pretranslatemessage,而Pretranslatemessage返回值都是真!!就是这个返回值导致的,下面我们来分析下,为什么影响这么大:
以模态对话框作说明
[code]
MyDiag test = new MyDiag(NULL);
test.DoModal();
[/code]
我们重点看DoModal后面windows做了什么,简单来说应该做了两件事:
1)发送一个DlgInit消息,这个消息最终的响应就是对话框的OnInitDialog(),创建成功后返回窗口句柄
如果DoModal后窗口还没显示出来就崩溃或者assert,OnInitDialog里面的代码怀疑最大,可能里面某些控件有问题,譬如没有注册,找不到等
2)进入消息循环,窗口就可以消息处理各种消息响应了
消息循环的关键代码如下:
[code]
do
{
if ( !PreTranslateMessage(&msg))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}while(::PeekMessage(pMsg,NULL,NULL,NULL,PM_NOREMOVE));
[/code]
从2的代码中我们可以看到,如果PreTranslateMessage为真,那就进入不会进TranslateMessage,跟不用说是消息的分发与响应了,这也就是为什么可以通过重写PreTranslateMessage可以消息队列中的消息,甚至是重定向消息,
PreTranslateMessage为真后,这个消息循环就空转,像一个死循环,为什么说像,而不是是,是因为windows会处理是不是idle的情况,当创建一个模态框后,焦点转到模态框,父窗口这是应该无法处理到idle的情况,而进入死循环,导致负荷一下飚升到50%(双核),修改PreTranslateMessage,出了要截获的消息,其他消息返回假,让消息循环继续处理消息。
- MFC消息截获之pretranslatemessage
- MFC的PreTranslateMessage截获Ctrl + 滚轮消息
- PreTranslateMessage()函数截获鼠标键盘消息
- PreTranslateMessage截获子窗口的消息
- MFC截获消息并处理
- MFC PreTranslateMessage
- MFC PreTranslateMessage
- MFC中使用PreTranslateMessage方法对消息进行筛选
- 在MFC中手动添加消息处理函数PreTranslateMessage
- 在MFC中手动添加消息处理函数PreTranslateMessage
- 截获消息
- 使用PreTranslateMessage(MSG* pMsg)截获键盘数字键
- Win32编程点滴之PreTranslateMessage与消息循环
- Win32编程点滴之PreTranslateMessage与消息循环
- 在MFC中手动添加消息处理函数PreTranslateMessage和自定义消息
- 在MFC中手动添加消息处理函数PreTranslateMessage和自定义消息
- PreTranslateMessage是消息
- PreTranslateMessage 处理键盘消息
- ios笔记--@property写法和autorelease pool自动释放池笔记
- 【完整的数据分析流程】
- vb变量定义方法
- Search for a Range
- Eclipse git图文教程
- MFC消息截获之pretranslatemessage
- VC++实现程序在任务栏中闪烁提示
- varchar 时间转换
- 很实用的关于ScrollView的操作,你知道吗?
- Windows 下 tail 查看日志命令工具分享
- <<C和指针>>第1章之编程练习心得20140702
- 常用SQL语句
- 对于cocos2d-x 3.0版本与之前版本的区别分析-------------cocos2d-x3.0正式版本(7.1)
- 《TCP/IP详解 卷1:协议》读书笔记