- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
转邪八:理解Windows消息机制
2007-09-19 18:53
文章作者:灰狐 (BinkE.S.T)信息来源:邪恶八进制信息安全团队()注:文章首发灰狐s Blog (www.HuiHu32.cN),后由原创作者友情提交到邪恶八进制信息安全团队技术论坛。本文绝大部分内容来源于《C++ Builder 高级应用开发指南》,清华大学出版社出版,李幼仪、甘志 编著,版权归他们所有。作者仅仅对其进行了拷贝,不享有除学习之外的任何权利。本文以及作者其他系列文章中出现的所有程序代码均经过严格的验证,如果没有特别说明即是在Win XP SP2 + C++ Builder 6.0的环境下测试通过。一、消息的基本概念消息(Message)指的就是Windows操作系统发给应用程序的一个通告,它告诉应用程序某个特定的事件发生了。比如,用户单击鼠标或按键都会引发Windows系统发送相应的消息。最终处理消息的是应用程序的窗口函数,如果程序不负责处理的话系统将会作出默认处理。从数据结构的角度来说,消息是一个结构体,它包含了消息的类型标识符以及其他的一些附加信息。比如对于鼠标单击产生的消息而言,它就包含了窗口句柄、此消息的常量标识符、鼠标的位置坐标等相关信息。Windows系统定义了许多消息常量,包括标准的Windows消息、通知消息、命令消息等等。这些消息常量通常具有XX_YYYY的形式,其他XX通常代表消息的类型,而后面的YYYY通常是这个消息所对应事件的英文缩写。比如WM_LBUTTONDOWN代表的事件就是按下了鼠标左键。二、Windows的消息系统Windows的消息系统由3个部分组成:
消息队列。Windows操作系统本身维护了一个系统消息队列,而对于每一个正在执行的Windows应用程序,系统会为其建立一个应用程序消息队列。应用程序可以从这个消息队列中获取消息,然后分派给对应的窗口。
消息循环。Windows应用程序中都包含了一段称作“消息循环(也称消息泵)”的代码,用来从消息队列中检索消息并把他们分发到相应的窗口函数中。正是这个消息循环使得一个应用程序能够响应外部的各种事件,所以消息循环往往是一个Windows应用程序的核心部分。
窗口函数。最终为了处理各种消息,Windows应用程序所创建的每个窗口(广义,包括实际窗口、控件等诸如此类的的内容)都会在系统中注册一个相应的窗口函数,此窗口函数从形式上看一个巨大的switch语句,用以处理由消息循环发送到该窗口的各种消息。窗口函数是一种回调函数(Callback Function),也就是说,它是由Windows操作系统负责调用的,而应用程序本身不能调用它。Windows操作系统中的消息从发生到被处理一般有5个步骤:(1)系统发生了一个事件。(2)Windows系统把事件翻译为对应的消息,并把它放到消息队列中。(3)应用程序从消息队列中获取消息,然后把它封装在TMsg结构中。(4)应用程序通过消息循环把消息分派给对应的窗口函数。(5)窗口函数负责最终处理这个消息。三、C++ Builder中的OnMessage事件C++ Builder为了方便消息处理,进一步把常用的消息封装成了各种相应事件,这样程序员通常情况下就无需考虑消息的具体细节,只要编写相应的事件处理函数即可。这就是所谓的基于事件的Windows程序开发。在C++ Builder开发的应用程序中,任何窗体接收到一个Windows消息都会触发一次OnMessage事件,所以可以通过响应TApplication对象的OnMessage事件来捕获任何发送给本程序的Windows消息。OnMessage事件的处理函数原型如下:typedef void __fastcall (__closure *TMessageEvent)(tagMSG Msg,bool Handled);这个函数有两个参数,其中参数Msg表示的是被截获的消息,而参数Handled则用来指示本消息是否已经处理完成。在程序中可以通过设置参数Handled为true以避免后续过程处理这个消息,反之亦然。需要注意的是,OnMessage事件仅仅接受发送到消息队列中的消息,而直接使用API函数 SendMessage()发送给窗口函数的消息将不会被截获到。另外,当程序运行的时候,OnMessage事件被触发的频率一般非常高,所以这个事件处理函数中的代码执行事件将直接影响到整个程序的运行效率。下面我们通过一个实例来演示OnMessage事件的处理过程。在这个范例中,程序将累计发生的OnMessage事件次数并显示在窗体上。我们在主窗体上放置一个Label组件,命名为Label1,用于显示消
您可能关注的文档
- 科研设计和撰写申报书2009.ppt
- 壳聚糖论文:壳聚糖 聚己内酯 共混薄膜 蛋白质粘附 纤维粘连蛋白 细胞行为.doc
- 可编程逻辑器件的应用及发展--广东.doc
- 可编程逻辑实验报告_实验2_用文本输入法设计门电路.doc
- 可编程逻辑知识体系总结.doc
- 可持续城市化论文:辽宁省可持续城市化水平研究.doc
- 可持续发展和科教兴国.doc
- 可持续发展与行政法关系研究.doc
- 可持续食品包装设计的框架.doc
- 可溶性细胞外AGEs可以与多种不同的细胞表面受体结合.doc
- 中国农业科学院农业资源与农业区划研究所2024年度公开招聘笔试备考题库及答案详解1套.docx
- 中国城市规划设计研究院2025年度公开招聘笔试模拟试题带答案详解.docx
- 2025年银川市公安局面向宁夏警官职业学院招聘285名警务辅助人员笔试模拟试题及完整答案详解1套.docx
- 2025年衢州市公安局第一期招聘54名警务辅助人员笔试模拟试题含答案详解.docx
- 2025年辽宁沈阳理工大学招聘高层次人才142人笔试模拟试题及答案详解1套.docx
- 中国民航科学技术研究院2024年度面向社会公开招聘工作人员笔试模拟试题及答案详解一套.docx
- 中国地质科学院矿产资源研究所2025年度公开招聘工作人员(第一批)笔试模拟试题及参考答案详解一套.docx
- 中国地质科学院地质力学研究所2024年度社会在职人员公开招聘笔试备考题库及答案详解1套.docx
- 中国疾病预防控制中心2024年度公开招聘学校卫生领域学科带头人笔试备考题库参考答案详解.docx
- 中国热带农业科学院南亚热带作物研究所2025年第二批公开招聘工作人员笔试模拟试题及答案详解一套.docx
文档评论(0)