前几天,查了一个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的更多相关文章

  1. MFC消息响应机制 q

    MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows ...

  2. MFC消息响应机制分析

    ---- 摘要: ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了系统的分析 ...

  3. 深入探讨MFC消息循环和消息泵

    首先,应该清楚MFC的消息循环(::GetMessage,::PeekMessage),消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情.在MFC ...

  4. 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 ...

  5. MFC消息映射机制以及画线功能实现

    ---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...

  6. 自制MFC消息响应定位器+原理分析

    mfc里面有张消息映射表(MESSAGE_MAP),消息都是通过这张表来分发到相应函数里的. 这个是我自制的定位器,从vc6.0到现在的2013生成的mfc都可以用,全静态扫描并已处理动态基址. 下面 ...

  7. Delphi中window消息截获的实现方式(1)

    近来笔者在一个项目中需要实现一个功能:模仿弹出菜单的隐藏方式,即鼠标在窗口的非PanelA区域点击时,使得PanelA隐藏.   经过思考,笔者想到通过处理鼠标的点击事件来实现相应功能.但是,究竟由谁 ...

  8. MFC编程入门之五(MFC消息映射机制概述)

    在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 一.什 ...

  9. VS2010/MFC编程入门之五(MFC消息映射机制概述)

    VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html 上一讲鸡啄米为大家简单分析了MFC应用 ...

随机推荐

  1. HTML系列(七):多媒体

    一.video标签 H5新增了video实现在线播放视频的功能: 代码示例: <video controls="controls"> <source src=&q ...

  2. c++中派生类对基类成员的三种访问规则(转)

    C++中派生类对基类成员的访问形式主要有以下两种:1.内部访问:由派生类中新增成员对基类继承来的成员的访问.2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在3中 ...

  3. virtualBox文件共享

    具体过程,可以参考: http://jingyan.baidu.com/article/2fb0ba40541a5900f2ec5f07.html 共享命令:sudo mount -t vboxsf ...

  4. Linux学习之linux目录

    文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.SHELL脚本.二进制的可执行文件等,可用cat ...

  5. Labview学习之程序Web发布

    Labview学习之程序Web发布 1. LabVIEW Web服务器     在LabVIEW开发环境中,自身带了一个已连接好的Web服务器.LabVIEW Web服务器除了与其他Web服务器一样能 ...

  6. less 工具

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...

  7. ThinkPHP第二十四天(JQuery常用方法、TP自动验证)

    ---恢复内容开始--- 1.JQuery常用方法 A:JS中可以用json格式数据当做数组使用,如var validate={username:false,pwd:false,pwded:false ...

  8. Analysis about different methods for reading and writing file in Java language

    referee:Java Programming Tutorial Advanced Input & Output (I/O) JDK 1.4+ introduced the so-calle ...

  9. android小知识之EditText输入框之值监控以及类型限制(数字,英语字母,下划线,是否为星号密码)

    1.设置EditText的值监听事件 . <span style="font-size:14px;color:#990000;"> EditText ed=new Ed ...

  10. Oracle数据库时间修改

    http://blog.csdn.net/tianlesoftware/article/details/6163859