MFC消息截获之pretranslatemessage
前几天,查了一个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,出了要截获的消息,其他消息返回假,让消息循环继续处理消息。
http://blog.csdn.net/lizheng308/article/details/36385241
MFC消息截获之pretranslatemessage的更多相关文章
- MFC消息响应机制 q
MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows ...
- MFC消息响应机制分析
---- 摘要: ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了系统的分析 ...
- 深入探讨MFC消息循环和消息泵
首先,应该清楚MFC的消息循环(::GetMessage,::PeekMessage),消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情.在MFC ...
- Meandering Through the Maze of MFC Message and Command Routing MFC消息路由机制分析
Meandering Through the Maze of MFC Message and Command Routing Paul DiLascia Paul DiLascia is a free ...
- MFC消息映射机制以及画线功能实现
---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...
- 自制MFC消息响应定位器+原理分析
mfc里面有张消息映射表(MESSAGE_MAP),消息都是通过这张表来分发到相应函数里的. 这个是我自制的定位器,从vc6.0到现在的2013生成的mfc都可以用,全静态扫描并已处理动态基址. 下面 ...
- Delphi中window消息截获的实现方式(1)
近来笔者在一个项目中需要实现一个功能:模仿弹出菜单的隐藏方式,即鼠标在窗口的非PanelA区域点击时,使得PanelA隐藏. 经过思考,笔者想到通过处理鼠标的点击事件来实现相应功能.但是,究竟由谁 ...
- MFC编程入门之五(MFC消息映射机制概述)
在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 一.什 ...
- VS2010/MFC编程入门之五(MFC消息映射机制概述)
VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html 上一讲鸡啄米为大家简单分析了MFC应用 ...
随机推荐
- sql server group by having 之复习篇
where 与 having 之间的差别在于where 是分组前的过滤,而having是分组后的过滤 Group By中Select指定的字段限制 示例3 select 类别, sum(数量) as ...
- JS学习笔记(一)基本数据类型和对象类型
js是一种弱类型的语言,所有的变量都用var进行声明,字符串用双引号或单引号括起来,常见基本数据类型为number,string,boolean等.如 var num = 123;或var num = ...
- matlab GUI之自定义菜单小结
自定义菜单 1.uimenu对象 h=uimenu('PropertyName','ProperValue') h=uimenu(parent,'PropertyName','ProperValue' ...
- 理解ROS话题
首先需要打开一个终端在里面运行roscore: roscore 再打开一个终端,在里面运行一个turtlesim_node节点: rosrun turtlesim turtlesim_node 打开另 ...
- R包——ggplot2(一)
关于ggplot2包(一) 关于ggplot2包(一) ggplot2基本要素 数据(Data)和映射(Mapping) 几何对象(Geometric) 标尺(Scale) 统计变换(Statisti ...
- springmvc入门demo
目录结构: package com.wyl; import org.springframework.stereotype.Controller; import org.springframework. ...
- HTML中小问题
1.a标签不添加href这个属性时,不会出现鼠标变成手型~
- poj 3487 稳定婚姻
/** 稳定婚姻:男生不停的求婚,女生不停地拒绝 **/ #include <iostream> #include <queue> #include <cstdio> ...
- poj 2689 大范围内素数筛选
/** 给定一定范围求其内的素数 注意: **/ #include <iostream> #include <math.h> #include <cstring> ...
- Mysql mysqlimport 导入数据
在mysql 数据库中可以用 mysqlimport 工具来实现数据的导入!mysqlimport 导入数据简单,但是这个也要满足一定的条件 1.既然是把数据导入到数据库,你总有一个数据库用户账号吧 ...