欢迎来到天天文库
浏览记录
ID:38223164
大小:34.50 KB
页数:6页
时间:2019-05-25
《Windows消息拦截技术的应用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Windows消息拦截技术的应用一、前 言众所周知,Windows程式的运行是依靠发生的事件来驱动。换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做适当的处理。处理完此次消息后又回到等待状态。从上面对Windows程式运行机制的分析不难发现,消息在用户与程式之间进行交流时起了一种中间“语言”的作用。在程式中接收和处理消息的主角是窗口,它通过消息泵接收消息,再通过一个窗口过程对消息进行相应的处理。消息拦截的实现是在窗口过程处理消息之前拦截到消息并做相关处理后再传送给原窗口过程。通常情况下,程序员可以在窗口过程中处理接收到的消息,这就要求窗口
2、过程必须在开发程序时完成,但是在一些应用中常常需要获取和处理另外应用程序或其它单元模块中的消息,实现此类功能的技术也就本文要讨论的主题――消息拦截技术。二、理解Windows消息机制在深入探讨消息拦截技术实现原理之前,让我们先来温习一下Windows消息机制原理知识。1、消息的产生消息作为程序与外界交流的“语言”,它的产生自然来自外界,但这里所说的外界,不只是简单的指程序之外或软件系统之外,而是泛指消息处理模块之外的模块、Windows系统、其它应用程序以及硬件等。通常根据消息产生的方式将其分为两大类,即硬件消息和软件消息。硬件消息,常指由硬件装置所产生的事件(
3、如鼠标或键盘被按下),放在系统消息队列(SystemQueue)中,再由系统消息处理机构将消息发送给应用程序消息队列中。软件消息,常指由Windows系统或其它应用程序发送的信息,它直接放入应用程序消息队列(ApplicationQueue)中,再由应用程序消息处理机构将消息传递给相应的窗口。2、消息的组成一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的
4、ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。3、消息的接收者一个消息必须由一个窗口接收。在窗口过程(WNDPROC)中可以对消息进行分析,对应用程序要求处理的消息进行相应的处理工作,对于那么不需要应用程序处理的消息可简单的调用缺省处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。4、消息的处理窗口接收到发送给自己的消息后,将消息结构作为参数调用窗口过程对消息进行相应的处理。可以将窗口过程看作消息处理代码
5、的集合,窗口过程函数的原型为:longFARPASCALWndProc(HWNDhWnd,WORDmessage,WORDwParam,LONGlParam);其中,hWnd为窗口句柄,message为消息名称,wParam,lParam为两个参数。在Windows中,应用程序不直接调用任何窗口函数,而是等待Windows调用窗口函数,请求完成任务或返回信息。为保证Windows调用这个窗口函数,这个函数必须先向Windows登记,然后在Windows实施相应操作时回调,所以窗口函数又称为回调函数。WndProc是一个主回调函数,Windows至少有一个回调函数
6、。它是在应用程序进行窗口类注册时向Windows登记的。三、利用钩子(Hook)拦截消息1、何为钩子(Hook)?钩子(Hook)机制允许应用程序截获处理window消息或特定事件。与DOS中断截获处理机制有类似之处。钩子是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,钩子可以在目标窗口处理函数之前处理它并且可以阻止消息的传递。每一个钩子都有一个与之相关联的指针列表,称之为钩子链表,该链表中的指针指向这个钩子的各个处理子程。钩子的种类很多,每种钩子可以拦截并处理相应
7、种类的消息。当钩子所监视的消息出现时,Windows调用链表中的第一个钩子子程,第一个过程完成后将消息传递链表中的下一个钩子子程,直至链表中所有钩子子程都执行完成(注意:如果在其中有一个钩子在执行完成前不执行消息传递,其后面的钩子过程和原窗口过程都不会再接收到消息。)后将消息返回给窗口过程。2、钩子子程函数钩子子程是一个应用程序定义的回调函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。其函数原型为:LRESULTCALLBACKHookProc(intnCode,WPARAMwParam,LPARAMlP
8、aram);其中,nCo
此文档下载收益归作者所有