windows消息大全及钩子介绍
第5讲 Windows消息机制及HOOK应用
HOOK管理的关键函数 SetWindowsHookEx UnhookWindowsHookEx CallNextHookEx
第5讲 Windows消息机制及HOOK应用
内容 事件/消息驱动 HOOK机制
1. Windows事件驱动机制
DOS程序的特点 顺序驱动和过程驱动
Windows程序的特点 操作无序 事件驱动 以消息为中心
WINDOWS消息处理过程
队列消息 基本上是用户输入的结果 击键(如WM_KEYDOWN和WM_KEYUP消息) 击键产生的字(WM_CHAR) 鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN) 时钟消息(WM_TIMER) 更新消息(WM_PAINT) 退出消息(WM_QUIT)
消息处理程序C
消息处理程序B
HOOK概念
消息处理程序C 消息处理程序A
消息处理程序B
C就是HOOK程序。即钩子 程序
C → B → A: 消息处理函数链
HOOK本质 一段用于处理系统消息的程序,这段程序由用户编写,挂入该消息的处理函数链中,被 OS自动调用 。
HOOK技术典型应用 木马程序【特征:平时潜伏,消息触发】 屏幕抓词、进程监控、垃圾邮件过滤、软件界面定制、……
while(ParentWnd !=NULL) { glhTargetWnd=ParentWnd; ParentWnd=GetParent(glhTargetWnd); } GetWindowText(glhTargetWnd,szCaption,100); //取目标窗口标题
Hook课件
基本概念
• 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以 在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口 可以是其他进程所创建的。当消息到达后,在目标窗口处理函数 之前处理它。钩子机制允许应用程序截获处理window消息或特定 事件。 • 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入 系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序 就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即 可以加工处理(改变)该消息,也可以不作处理而继续传递该消 息,还可以强制结束消息的传递。
HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的 子程的DLL。 // 如果dwThreadId 标识当前进程创建的一个线程, // 而且子程代码位于当前进程,hMod必须为NULL。 // 可以很简单的设定其为本应用程序的实例句柄。 DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。 // 如果为0,钩子子程与所有的线程关联,即为全局钩子。 ); 函数成功则返回钩子子程的句柄,失败返回NULL。 以上所说的钩子子程与线程相关联是指在一钩子链表中发给该线程的消息同 时发送给钩子子程,且被钩子子程先处理。
(Hook procedure)
可以设定定的值
指定要 Monitor 所有的 thread
WH_KEYBOARD: 设定当目标收到 Keyboard Message 之前,呼叫你的 function
系统如何应对 SetWindowsHookEx?
BOOL WINAPI SetDIPSHook(DWORD dwThreadId){
•
• • • • •
•
钩子函数讲解
钩⼦函数讲解钩⼦,⼏乎所有的键盘监控程序都使⽤钩⼦机制来捕获系统的击键信息。
⼤家知道,在DOS操作系统下,如果要截获某种系统功能,可以在编程中采取截获中断的办法,⽐如要获取击键信息,可以使⽤9号中断调⽤,要获取应⽤程序对⽂件操作功能的调⽤可以截获21号中断。
DOS下截获中断的⽅法是这样的随意和⽅便,不论是驱动程序还是应⽤程序都可以操作,这样就给⼀些恶意程序留下了可乘之机,对系统的安全造成了极⼤的隐患。
⽽在Windows 2000下就不同了,Windows 2000采⽤了保护模式,在保护模式下的中断描述符表是受系统保护的,应⽤程序是不可能再通过修改中断向量来截获系统中断了。
这在提供了更⾼安全性的同时,实际上对应⽤程序在调⽤底层功能⽅⾯造成了很⼤的不便。
不过,Windows采取了⼀些变通的⽅法,将⼀些系统的底层调⽤封装在了⾃⼰的API函数中,通过向⽤户提供接⼝使⽤户可以受限的使⽤⼀些系统调⽤。
钩⼦,⼏乎所有的键盘监控程序都使⽤钩⼦机制来捕获系统的击键信息。
⼤家知道,在DOS操作系统下,如果要截获某种系统功能,可以在编程中采取截获中断的办法,⽐如要获取击键信息,可以使⽤9号中断调⽤,要获取应⽤程序对⽂件操作功能的调⽤可以截获21号中断。
DOS下截获中断的⽅法是这样的随意和⽅便,不论是驱动程序还是应⽤程序都可以操作,这样就给⼀些恶意程序留下了可乘之机,对系统的安全造成了极⼤的隐患。
⽽在Windows 2000下就不同了,Windows 2000采⽤了保护模式,在保护模式下的中断描述符表是受系统保护的,应⽤程序是不可能再通过修改中断向量来截获系统中断了。
这在提供了更⾼安全性的同时,实际上对应⽤程序在调⽤底层功能⽅⾯造成了很⼤的不便。
不过,Windows采取了⼀些变通的⽅法,将⼀些系统的底层调⽤封装在了⾃⼰的API函数中,通过向⽤户提供接⼝使⽤户可以受限的使⽤⼀些系统调⽤。
TIPS:钩⼦是Windows的消息处理机制中提供的⼀个监视点,应⽤程序可以在这⾥安装⼀个过滤程序,这样就可以在系统中的消息流到达⽬的程序前监控它们。
钩子函数捕捉键盘消息
利用钩子函数来捕捉键盘响应的windows应用程序一:引言:你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到了windows的钩子函数。
因此本文将对钩子函数的相关知识进行阐述。
当然,本文的目的并不是想通过此程序让读者去窃取别人的密码,只是由于钩子函数在windows系统中是一个非常重要的系统接口函数,所以想和大家共同的探讨,当然本文也对怎样建立动态连结库(DLL)作了一些简单的描述。
(本文的程序为vc6.0的开发环境,语言是:C和win32 api)。
二:钩子概述:微软的windowsX操作系统是建立在事件驱动的机制上的,也就是通过消息传递来实现。
而钩子在windows操作系统中,是一种能在事件(比如:消息、鼠标激活、键盘响应)到达应用程序前中途接获事件的机制。
而且,钩子函数还可以通过修改、丢弃等手段来对事件起作用。
Windows 有两种钩子,一种是特定线程钩子(Thread specific hooks),一种是全局系统钩子(Systemwide hooks)。
特定线程钩子只是监视指定的线程,而全局系统钩子则可以监视系统中所有的线程。
无论是特定线程钩子,还是全局系统钩子,都是通过SetWindowsHookEx ()来设置钩子的。
对于特定线程钩子,钩子的函数既可以是包含在一个.exe也可以是一个.dll。
但是对于一个全局系统钩子,钩子函数必须包含在独立的dll中,因此,当我们要捕捉键盘响应时,我们必须创建一个动态链接库。
但是当钩子函数在得到了控制权,并对相关的事件处理完后,如果想要该消息得以继续的传递,那么则必须调用另一个函数:CallNextHookEx。
由于系统必须对每个消息处理,钩子程序因此增加了处理的负担,因此也降低了系统的性能。
鉴于这一点,在windows ce中对钩子程序并不支持。
windows消息大全
Windows消息大全什么是Windows消息?Windows消息是在Windows操作系统中用于应用程序之间进行通信的一种机制。
通过发送和接收消息,应用程序可以向其他应用程序发送命令、请求数据或通知一些事件的发生。
Windows操作系统提供了一系列的系统消息,同时也允许应用程序自定义和发送消息。
系统消息Windows操作系统中的系统消息由操作系统负责发送和处理,这些消息通常涉及到操作系统的各个方面。
下面是一些常见的系统消息:1.WM_CREATE:当窗口被创建时发送。
2.WM_DESTROY:当窗口被销毁时发送。
3.WM_PAINT:当窗口需要绘制时发送。
4.WM_CLOSE:当用户关闭窗口时发送。
5.WM_QUIT:当应用程序需要退出时发送。
6.WM_SIZE:当窗口大小改变时发送。
7.WM_MOUSEMOVE:当鼠标移动时发送。
8.WM_KEYDOWN:当按下键盘上的一个键时发送。
这只是一小部分系统消息的例子,Windows操作系统中还有很多其他的系统消息可供使用。
自定义消息除了系统消息,应用程序还可以自定义消息以实现应用程序之间的通信。
自定义消息通常基于用户定义的消息号。
下面是一些自定义消息的例子:1.WM_MY_MESSAGE1:用户自定义的消息1。
2.WM_MY_MESSAGE2:用户自定义的消息2。
3.WM_MY_MESSAGE3:用户自定义的消息3。
自定义消息的消息号必须在WM_USER之后,以避免与系统消息冲突。
消息参数除了发送消息本身外,应用程序还可以使用参数来传递额外的信息。
参数通常包含在消息的wParam和lParam字段中。
•wParam表示一个无符号的整数,用于传递一些简单的数值信息。
•lParam通常表示一个指针,指向一些复杂的数据结构。
应用程序可以根据消息的含义和需要来使用这些参数。
如何发送和接收消息在Windows操作系统中,应用程序可以使用函数来发送和接收消息。
Windows窗口消息大全
Window s窗口消息大全#消息,就是指Win dows发出的一个通知,告诉应用程序某个事情发生了。
例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Wind ows发送一个消息给应用程序。
消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。
例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。
这个记录类型叫做TMs g,#它在Wind ows单元中是这样声明的:#type#TMsg = packed record#hwnd: HWND; / /窗口句柄#messag e: UINT; / /消息常量标识符#wParam: WPARAM ; // 32位消息的特定附加信息#lParam: LPARAM ; // 32位消息的特定附加信息#time: DWORD; / /消息创建时的时间#pt: TPoint; / /消息创建时的鼠标位置#end;#消息中有什么?#是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:#hwnd 32位的窗口句柄。
窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。
#messag e 用于区别其他消息的常量值,这些常量可以是Wind ows单元中预定义的常量,也可以是自定义的常量。
#wParam通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。
#lParam通常是一个指向内存中数据的指针。
由于W P a r a m、l P a r a m和P o i n t e r都是3 2位的,#因此,它们之间可以相互转换。
WM_NUL L = 0x0000;WM_CRE ATE = 0x0001;#应用程序创建一个窗口WM_DES TROY= 0x0002;#一个窗口被销毁WM_MOV E = 0x0003;#移动一个窗口WM_SIZ E = 0x0005;#改变一个窗口的大小WM_ACT IVATE = 0x0006;#一个窗口被激活或失去激活状态;WM_SET FOCUS = 0x0007;#获得焦点后WM_KIL LFOCU S = 0x0008;#失去焦点WM_ENA BLE = 0x000A;#改变enab le状态WM_SET REDRA W = 0x000B;#设置窗口是否能重画WM_SET TEXT= 0x000C;#应用程序发送此消息来设置一个窗口的文本WM_GET TEXT= 0x000D;#应用程序发送此消息来复制对应窗口的文本到缓冲区WM_GET TEXTL ENGTH = 0x000E;#得到与一个窗口有关的文本的长度(不包含空字符)WM_PAI NT = 0x000F;#要求一个窗口重画自己WM_CLO SE = 0x0010;#当一个窗口或应用程序要关闭时发送一个信号WM_QUE RYEND SESSI ON = 0x0011;#当用户选择结束对话框或程序自己调用Exit Windo ws函数WM_QUI T = 0x0012;#用来结束程序运行或当程序调用po stqui tmess age函数WM_QUE RYOPE N = 0x0013;#当用户窗口恢复以前的大小位置时,把此消息发送给某个图标WM_ERA SEBKG ND = 0x0014;#当窗口背景必须被擦除时(例在窗口改变大小时)WM_SYS COLOR CHANG E = 0x0015;#当系统颜色改变时,发送此消息给所有顶级窗口WM_END SESSI ON = 0x0016;#当系统进程发出WM_Q UERYE NDSES SION消息后,此消息发送给应用程序,#通知它对话是否结束WM_SYS TEMER ROR = 0x0017;WM_SHO WWIND OW = 0x0018;#当隐藏或显示窗口是发送此消息给这个窗口WM_ACT IVATE APP = 0x001C;#发此消息给应用程序哪个窗口是激活的,哪个是非激活的;WM_FON TCHAN GE = 0x001D;#当系统的字体资源库变化时发送此消息给所有顶级窗口WM_TIM ECHAN GE = 0x001E;#当系统的时间变化时发送此消息给所有顶级窗口WM_CAN CELMO DE = 0x001F;#发送此消息来取消某种正在进行的摸态(操作)WM_SET CURSO R = 0x0020;#如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口WM_MOU SEACT IVATE = 0x0021;#当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口WM_CHI LDACT IVATE = 0x0022;#发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小WM_QUE UESYN C = 0x0023;#此消息由基于计算机的训练程序发送,通过WH_J OURNA LPALY BACK的hook程序#分离出用户输入消息WM_GET MINMA XINFO = 0x0024;#此消息发送给窗口当它将要改变大小或位置;WM_PAI NTICO N = 0x0026;#发送给最小化窗口当它图标将要被重画WM_ICO NERAS EBKGN D = 0x0027;#此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画WM_NEX TDLGC TL = 0x0028;#发送此消息给一个对话框程序去更改焦点位置WM_SPO OLERS TATUS = 0x002A;#每当打印管理列队增加或减少一条作业时发出此消息WM_DRA WITEM = 0x002B;#当butto n,combob ox,listbo x,menu的可视外观改变时发送#此消息给这些空件的所有者WM_MEA SUREI TEM = 0x002C;#当butto n, combobox, list box, list view contro l, or menu item 被创建时#发送此消息给控件的所有者WM_DEL ETEIT EM = 0x002D;#当the list box 或combobox 被销毁或当某些项被删除通过LB_DELET ESTRI NG, LB_RES ETCON TENT, CB_DEL ETEST RING, or CB_RES ETCON TENT消息WM_VKE YTOIT EM = 0x002E;#此消息有一个LBS_W ANTKE YBOAR DINPU T风格的发出给它的所有者来响应WM_KE YDOWN 消息WM_CHA RTOIT EM = 0x002F;#此消息由一个LBS_W ANTKE YBOAR DINPU T风格的列表框发送给他的所有者来响应WM_CHAR 消息WM_SET FONT= 0x0030;#当绘制文本时程序发送此消息得到控件要用的颜色WM_GET FONT= 0x0031;#应用程序发送此消息得到当前控件绘制文本的字体WM_SET HOTKE Y = 0x0032;#应用程序发送此消息让一个窗口与一个热键相关连WM_GET HOTKE Y = 0x0033;#应用程序发送此消息来判断热键与某个窗口是否有关联WM_QUE RYDRA GICON = 0x0037;#此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标WM_COM PAREI TEM = 0x0039;#发送此消息来判定com bobox或list box新增加的项的相对位置WM_GET OBJEC T = 0x003D;WM_COM PACTI NG = 0x0041;#显示内存已经很少了WM_WIN DOWPO SCHAN GING= 0x0046;#发送此消息给那个窗口的大小和位置将要被改变时,来调用set windo wpos函数或其它窗口管理函数WM_WIN DOWPO SCHAN GED = 0x0047;#发送此消息给那个窗口的大小和位置已经被改变时,来调用set windo wpos函数或其它窗口管理函数WM_POW ER = 0x0048;(适用于16位的wind ows)#当系统将要进入暂停状态时发送此消息WM_COP YDATA = 0x004A;#当一个应用程序传递数据给另一个应用程序时发送此消息WM_CAN CELJO URNAL = 0x004B;#当某个用户取消程序日志激活状态,提交此消息给程序WM_NOT IFY = 0x004E;#当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口WM_INP UTLAN GCHAN GEREQ UEST= 0x0050;#当用户选择某种输入语言,或输入语言的热键改变WM_INP UTLAN GCHAN GE = 0x0051;#当平台现场已经被改变后发送此消息给受影响的最顶级窗口WM_TCA RD = 0x0052;#当程序已经初始化win dows帮助例程时发送此消息给应用程序WM_HEL P = 0x0053;#此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就#发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口WM_USE RCHAN GED = 0x0054;#当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体#设置信息,在用户更新设置时系统马上发送此消息;WM_NOT IFYFO RMAT= 0x0055;#公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用A NSI还是UNICO DE结构#在WM_NO TIFY消息,使用此控件能使某个控件与它的父控件之间进行相互通信WM_CON TEXTM ENU = 0x007B;#当用户某个窗口中点击了一下右键就发送此消息给这个窗口WM_STY LECHA NGING = 0x007C;#当调用SET WINDO WLONG函数将要改变一个或多个窗口的风格时发送此消息给那个窗口WM_STY LECHA NGED= 0x007D;#当调用SET WINDO WLONG函数一个或多个窗口的风格后发送此消息给那个窗口WM_DIS PLAYC HANGE = 0x007E;#当显示器的分辨率改变后发送此消息给所有的窗口WM_GET ICON= 0x007F;#此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄;WM_SET ICON= 0x0080;#程序发送此消息让一个新的大图标或小图标与某个窗口关联;WM_NCC REATE = 0x0081;#当某个窗口第一次被创建时,此消息在WM_CREA TE消息发送前发送;WM_NCD ESTRO Y = 0x0082;#此消息通知某个窗口,非客户区正在销毁WM_NCC ALCSI ZE = 0x0083;#当某个窗口的客户区域必须被核算时发送此消息WM_NCH ITTES T = 0x0084;//移动鼠标,按住或释放鼠标时发生WM_NCP AINT= 0x0085;#程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时;WM_NCA CTIVA TE = 0x0086;#此消息发送给某个窗口仅当它的非客户区需要被改变来显示是激活还是非激活状态;WM_GET DLGCO DE = 0x0087;#发送此消息给某个与对话框程序关联的控件,widdow s控制方位键和TAB键使输入进入此控件#通过响应WM_GETD LGCOD E消息,应用程序可以把他当成一个特殊的输入控件并能处理它WM_NCM OUSEM OVE = 0x00A0;#当光标在一个窗口的非客户区内移动时发送此消息给这个窗口//非客户区为:窗体的标题栏及窗的边框体WM_NCL BUTTO NDOWN = 0x00A1;#当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息WM_NCL BUTTO NUP = 0x00A2;#当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息;WM_NCL BUTTO NDBLC LK = 0x00A3;#当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息WM_NCR BUTTO NDOWN = 0x00A4;#当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息WM_NCR BUTTO NUP = 0x00A5;#当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息WM_NCR BUTTO NDBLC LK = 0x00A6;#当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息WM_NCM BUTTO NDOWN = 0x00A7;#当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息WM_NCM BUTTO NUP = 0x00A8;#当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息WM_NCM BUTTO NDBLC LK = 0x00A9;#当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息WM_KEY FIRST = 0x0100;WM_KEY DOWN= 0x0100;#//按下一个键WM_KEY UP = 0x0101;#//释放一个键WM_CHA R = 0x0102;#//按下某键,并已发出WM_KEYD OWN, WM_KEY UP消息WM_DEA DCHAR = 0x0103;#当用tran slate messa ge函数翻译WM_K EYUP消息时发送此消息给拥有焦点的窗口WM_SYS KEYDO WN = 0x0104;#当用户按住A LT键同时按下其它键时提交此消息给拥有焦点的窗口;WM_SYS KEYUP = 0x0105;#当用户释放一个键同时A LT 键还按着时提交此消息给拥有焦点的窗口WM_SYS CHAR= 0x0106;#当WM_SY SKEYD OWN消息被TRAN SLATE MESSA GE函数翻译后提交此消息给拥有焦点的窗口WM_SYS DEADC HA R = 0x0107;#当WM_SY SKEYD OWN消息被TRAN SLATE MESSA GE函数翻译后发送此消息给拥有焦点的窗口WM_KEY LAST= 0x0108;WM_INI TDIAL OG = 0x0110;#在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务WM_COM MAND= 0x0111;#当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译WM_SYS COMMA ND = 0x0112;#当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息WM_TIM ER = 0x0113; //发生了定时器事件WM_HSC ROLL= 0x0114;#当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件WM_VSC ROLL= 0x0115;#当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件 WM_INI TMENU = 0x0116;#当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单WM_INI TMENU POPUP = 0x0117;#当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部WM_MEN USELE CT = 0x011F;#当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)WM_MEN UCHAR = 0x0120;#当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者;WM_ENT ERIDL E = 0x0121;#当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待WM_MEN URBUT TONUP = 0x0122;WM_MEN UDRAG = 0x0123;WM_MEN UGETO BJECT = 0x0124;WM_UNI NITME NUPOP UP = 0x0125;WM_MEN UCOMM AND = 0x0126;WM_CHA NGEUI STATE = 0x0127;WM_UPD ATEUI STATE = 0x0128;WM_QUE RYUIS TATE= 0x0129;WM_CTL COLOR MSGBO X = 0x0132;#在windo ws绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色WM_CTL COLOR EDIT= 0x0133;#当一个编辑型控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色WM_CTL COLOR LISTB OX = 0x0134;#当一个列表框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色WM_CTL COLOR BTN = 0x0135;#当一个按钮控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色WM_CTL COLOR DLG = 0x0136;#当一个对话框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色WM_CTL COLOR SCROL LBAR=0x0137;#当一个滚动条控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色WM_CTL COLOR STATI C = 0x0138;#当一个静态控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色WM_MOU SEFIR ST = 0x0200;WM_MOU SEMOV E = 0x0200;#// 移动鼠标WM_LBU TTOND OWN = 0x0201;#//按下鼠标左键WM_LBU TTONU P = 0x0202;#//释放鼠标左键WM_LBU TTOND BLCLK = 0x0203;#//双击鼠标左键WM_RBU TTOND OW N = 0x0204;#//按下鼠标右键WM_RBU TTONU P = 0x0205;#//释放鼠标右键WM_RBU TTOND BLCLK = 0x0206;#//双击鼠标右键WM_MBU TTOND OW N = 0x0207;#//按下鼠标中键WM_MBU TTONU P = 0x0208;#//释放鼠标中键WM_MBU TTOND BLCLK = 0x0209;#//双击鼠标中键WM_MOU SEWHE EL = 0x020A;#当鼠标轮子转动时发送此消息个当前有焦点的控件WM_MOU SELAS T = 0x020A;WM_PAR ENTNO TIFY= 0x0210;#当MDI子窗口被创建或被销毁,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口WM_ENT ERMEN ULOOP = 0x0211;#发送此消息通知应用程序的主窗口t hat已经进入了菜单循环模式WM_EXI TMENU LOOP= 0x0212;#发送此消息通知应用程序的主窗口t hat已退出了菜单循环模式WM_NEX TMENU = 0x0213;WM_SIZ ING = 532;#当用户正在调整窗口大小时发送此消息给窗口;通过此消息应用程序可以监视窗口大小和位置也可以修改他们WM_CAP TUREC HANGE D = 533;#发送此消息给窗口当它失去捕获的鼠标时;WM_MOV ING = 534;#当用户在移动窗口时发送此消息,通过此消息应用程序可以监视窗口大小和位置也可以修改他们;WM_POW ERBRO ADCAS T = 536;#此消息发送给应用程序来通知它有关电源管理事件;WM_DEV ICECH ANGE= 537;#当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序WM_IME_STAR TCOMP OSITI ON = 0x010D;WM_IME_ENDC OMPOS ITION = 0x010E;WM_IME_COMP OSITI ON = 0x010F;WM_IME_KEYL AST = 0x010F;WM_IME_SETC ONTEX T = 0x0281;WM_IME_NOTI FY = 0x0282;WM_IME_CONT ROL = 0x0283;WM_IME_COMP OSITI ONFUL L = 0x0284;WM_IME_SELE CT = 0x0285;WM_IME_CHAR = 0x0286;WM_IME_REQU EST = 0x0288;WM_IME_KEYD OWN = 0x0290;WM_IME_KEYU P = 0x0291;WM_MDI CREAT E = 0x0220;#应用程序发送此消息给多文档的客户窗口来创建一个MDI子窗口WM_MDI DESTR OY = 0x0221;#应用程序发送此消息给多文档的客户窗口来关闭一个MDI子窗口WM_MDI ACTIV ATE = 0x0222;#应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MD I子窗口,当客户窗口收到此消息后,它发出WM_MDIAC TIVE消息给MDI子窗口(未激活)激活它;WM_MDI RESTO RE = 0x0223;#程序发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小WM_MDI NEXT= 0x0224;#程序发送此消息给MDI客户窗口激活下一个或前一个窗口WM_MDI MAXIM IZE = 0x0225;#程序发送此消息给MDI客户窗口来最大化一个MDI子窗口;WM_MDI TILE= 0x0226;#程序发送此消息给MDI客户窗口以平铺方式重新排列所有MD I子窗口WM_MDI CASCA DE = 0x0227;#程序发送此消息给MDI客户窗口以层叠方式重新排列所有MD I子窗口WM_MDI ICONA RRANG E = 0x0228;#程序发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口WM_MDI GETAC TIVE= 0x0229;#程序发送此消息给MDI客户窗口来找到激活的子窗口的句柄WM_MDI SETME NU = 0x0230;#程序发送此消息给MDI客户窗口用MD I菜单代替子窗口的菜单WM_ENT ERSIZ EMOVE = 0x0231;WM_EXI TSIZE MOVE= 0x0232;WM_DRO PFILE S = 0x0233;WM_MDI REFRE SHMEN U = 0x0234;WM_MOU SEHOV ER = 0x02A1;WM_MOU SELEA VE = 0x02A3;WM_CUT = 0x0300;#程序发送此消息给一个编辑框或co mbobo x来删除当前选择的文本WM_COP Y = 0x0301;#程序发送此消息给一个编辑框或co mbobo x来复制当前选择的文本到剪贴板WM_PAS TE = 0x0302;#程序发送此消息给edi tcont rol或c ombob ox从剪贴板中得到数据WM_CLE A R = 0x0303;#程序发送此消息给edi tcont rol或c ombob ox清除当前选择的内容;WM_UND O = 0x0304;#程序发送此消息给edi tcont rol或c ombob ox撤消最后一次操作WM_REN DERFO RMAT= 0x0305;WM_REN DERAL LFORM ATS = 0x0306;WM_DES TROYC LIPBO A RD = 0x0307;#当调用ENP TYCLI PBOAR D函数时发送此消息给剪贴板的所有者WM_DRA WCLIP BOARD = 0x0308;#当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口;它允许用剪贴板观察窗口来显示剪贴板的新内容;WM_PAI NTCLI PBOAR D = 0x0309;#当剪贴板包含CF_OW NERDI PLAY格式的数据并且剪贴板观察窗口的客户区需要重画;WM_VSC ROLLC LIPBO ARD = 0x030A;WM_SIZ ECLIP BOARD = 0x030B;#当剪贴板包含CF_OW NERDI PLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者;WM_ASK CBFOR MATNA ME = 0x030C;#通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_O WNERD ISPLA Y格式的剪贴板的名字WM_CHA NGECB CHAIN = 0x030D;#当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口;WM_HSC ROLLC LIPBO ARD = 0x030E;#此消息通过一个剪贴板观察窗口发送给剪贴板的所有者;它发生在当剪贴板包含C FOWNE RDISP ALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上;所有者应滚动剪贴板图象并更新滚动条的值;WM_QUE RYNEW PALET TE = 0x030F;#此消息发送给将要收到焦点的窗口,此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板WM_PAL ETTEI SCHAN GING=0x0310;#当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序WM_PAL ETTEC HANGE D = 0x0311;#此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口,以此来改变系统调色板WM_HOT KEY = 0x0312;#当用户按下由REGIS TERHO TKEY函数注册的热键时提交此消息WM_PRI NT = 791;#应用程序发送此消息仅当WINDO WS或其它应用程序发出一个请求要求绘制一个应用程序的一部分;WM_PRI NTCLI ENT = 792;WM_HAN DHELD FIRST = 856;WM_HAN DHELD LAST= 863;WM_PEN WINFI RST = 0x0380;WM_PEN WINLA ST = 0x038F;WM_COA LESCE_FIRS T = 0x0390;WM_COA LESCE_LAST = 0x039F;WM_DDE_FIRS T = 0x03E0;WM_DDE_INIT IATE= WM_DDE_FIRS T + 0;#一个DDE客户程序提交此消息开始一个与服务器程序的会话来响应那个指定的程序和主题名;WM_DDE_TERM INATE = WM_DDE_FIRS T + 1;#一个DDE应用程序(无论是客户还是服务器)提交此消息来终止一个会话;WM_DDE_ADVI SE = WM_DDE_FIRS T + 2;#一个DDE客户程序提交此消息给一个DDE服务程序来请求服务器每当数据项改变时更新它WM_DDE_UNAD VISE= WM_DDE_FIRS T + 3;#一个DDE客户程序通过此消息通知一个DDE服务程序不更新指定的项或一个特殊的剪贴板格式的项WM_DDE_ACK= WM_DDE_FIRS T + 4;#此消息通知一个DDE(动态数据交换)程序已收到并正在处理W M_DDE_POKE, WM_DDE_EXEC UTE, WM_DDE_DATA, WM_DDE_ADVI SE, WM_DDE_UNAD VISE,or WM_DDE_INIT IAT消息WM_DDE_DATA = WM_DDE_FIRS T + 5;#一个DDE服务程序提交此消息给D DE客户程序来传递个一数据项给客户或通知客户的一条可用数据项WM_DDE_REQU EST = WM_DDE_FIRS T + 6;#一个DDE客户程序提交此消息给一个DDE服务程序来请求一个数据项的值;WM_DDE_POKE = WM_DDE_FIRS T + 7;#一个DDE客户程序提交此消息给一个DDE服务程序,客户使用此消息来请求服务器接收一个未经同意的数据项;服务器通过答复WM_D DE_AC K消息提示是否它接收这个数据项;WM_DDE_EXEC UTE = WM_DDE_FIRS T + 8;#一个DDE客户程序提交此消息给一个DDE服务程序来发送一个字符串给服务器让它象串行命令一样被处理,服务器通过提交WM_D DE_AC K消息来作回应;WM_DDE_LAST = WM_DDE_FIRS T + 8;WM_APP = 0x8000;WM_USE R = 0x0400;#此消息能帮助应用程序自定义私有消息;。
用VB6编的截获Windows消息的钩子的源码
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP WM_RBUTTONDBLCLK = &H206
再例如:键盘的敲击动作,在别的地方敲击键盘,并没有在自己的Form中敲击键盘,怎么才能获得按键的具体键值呢?
对单片机有了解的朋友都知道,鼠标和键盘的操作都是利用的是“中断”触发事件来完成的,那么当系统“中断”的时候,就会发出消息给操作系统,而这些消息就是Windows全局消息。
If hHook = 0 Then
hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)
End If
End Sub
Public Sub FreeHook()
If hHook <> 0 Then
模块代码:
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
HookProc = 0 '令待完成的動作繼續完成
'End If
End If
If wParam = WM_LBUTTONDOWN Then
Debug.Print "l"
windows消息大全及钩子介绍
windows消息大全及钩子介绍windows消息大全 (2)声明 (2)消息中有什么? (2)通知消息 (23)按扭 (23)组合框 (23)编辑框 (24)列表框 (24)Windows消息中的虚拟键列表 (25)Windows消息中的虚拟键 (25)DirectInput中的虚拟键 (27)HOOK专题 (29)基本概念 (29)运行机制 (30)1、钩子链表和钩子子程: (30)2、钩子的安装与释放: (31)3、一些运行机制: (34)4、系统钩子与线程钩子: (35)钩子类型 (35)1、WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks (36)2、WH_CBT Hook (36)3、WH_DEBUG Hook (37)4、WH_FOREGROUNDIDLE Hook (37)5、WH_GETMESSAGE Hook (37)6、WH_JOURNALPLAYBACK Hook (37)7、WH_JOURNALRECORD Hook (38)8、WH_KEYBOARD Hook (38)9、WH_KEYBOARD_LL Hook (38)10、WH_MOUSE Hook (38)11、WH_MOUSE_LL Hook (38)12、WH_MSGFILTER和WH_SYSMSGFILTER Hooks (39)13、WH_SHELL Hook (39)windows消息大全消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。
例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。
消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。
例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。
这个记录类型叫做TMsg,声明它在Windows单元中是这样声明的:typeTMsg=packed recordhwnd:HWND;//窗口句柄message:UINT;//消息常量标识符wParam:WPARAM;//32位消息的特定附加信息lParam:LPARAM;//32位消息的特定附加信息time:DWORD;//消息创建时的时间pt:TPoint;//消息创建时的鼠标位置end;消息中有什么?是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:hwnd32位的窗口句柄。
常用的十三种hook类型
本文将试图以下面的顺序讲解HOOK的大部分内容:1、 WINDOWS的消息机制2、 HOOK介绍3、 HOOK链4、 HOOK钩子的作用范围5、 HOOK类型6、回调函数7、 HOOK钩子的安装与卸载8、 HOOK实例演示+++++++++++++++++++WINDOWS的消息机制+++++++++++++++++++Windows系统是以消息处理为其控制机制,系统通过消息为窗口过程(windowsprocedure)传递输入。
系统和应用两者都可以产生消息。
对于每个输入事件,例如用户按下了键盘上的某个键、移动了鼠标、单击了一个控件上的滚动条,等等,系统都将产生一系列消息。
此外,对于应用带给系统的变化,如字体资源的改变、应用本身窗口的改变,系统都将通过消息以响应这种变化。
应用通过产生消息指示应用的窗口完成特定的任务,或与其他应用的窗口进行通信。
每个窗口都有一个处理Windows系统发送消息的处理程序,称为窗口程序。
它是隐含在窗口背后的一段程序脚本,其中包含对事件进行处理的代码。
Windows系统为每条消息指定了一个消息编号,例如当一个窗口变为活动窗口时,它事实上是收到一条来自Windows系统的WM_ACTIVATE消息,该消息的编号为6,它对应于VB窗口的Activate事件。
对于窗口来说,诸如Open、Activate、MouseDown、Resize 等事件,实际上对应的是窗口内部的消息处理程序,这些程序对于用户来讲是不可见的。
类似地,命令按钮也有消息处理程序,它的处理程序响应诸如WM_LBUTTONDOWN和WM_RBUTTONDOWN之类的消息,即激活命令按钮的MouseDown事件。
WINDOWS的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种回调函数(HOOK)的功能。
这种挂钩函数(HOOK)类似扩充中断驱动程序,挂钩上可以挂接多个反调函数构成一个挂接函数链。
什么是Windows钩子
什么是Windows钩子1. Windows钩子简介在DOS操作系统下编程的时候,如果想截获某种系统功能,可以采取截获中断的办法,比如要获取击键的动作可以截获9号中断,要获取应用程序对文件操作功能的调用可以截获21h号DOS中断,由于DOS是单任务系统,所以这些操作几乎全部是内存驻留程序做的。
DOS下截获中断的方法是这样的简单和随意,不管在驱动程序层次还是在应用程序层次都可以完成,以至于到最后大半的截获操作是由病毒使用的。
在Windows下就不同了,我们已经知道保护模式下的中断描述符表是受系统保护的,在应用程序层次是不可能再通过修改中断向量来截获系统中断了,但这样也对一些应用造成了不便,当做一种变通的措施,Windows提供了钩子来完成类似的功能。
那么,钩子是什么呢?Win32 API手册中是这样描述的:“A hook is a point in the Microsoft Windows message-handling mechanism where an application can install a subroutine to monitor the message traffic in the system and process certain types of messages before they reach the target window procedure.”翻译过来就是:“钩子是Windows的消息处理机制中的一个监视点,应用程序可以在这里安装一个监视子程序,这样就可以在系统中的消息流到达目的窗口过程前监控它们。
”也就是说,钩子可以用来截获系统中的消息流,显然,钩子不是像截获中断一样用来随心所欲地截获系统底层功能的,那么钩子能够用来做什么事情呢?(我仿佛听到了一些阴险的笑声……)不用笑得这么阴险嘛!大家想得没错,如果把钩子用在后台执行的程序中,就能够偷偷检查任何程序中发生的WM_CHAR消息,这样用户输入的任何内容:账号、密码、情书——不管是什么,不管是否显示在屏幕上——都可以被记录下来。
关于钩子程序和屏幕取词的一些资料
关于钩子程序和屏幕取词的一些资料屏幕抓词(或者叫动态翻译)是指随着鼠标的移动,软件能够随时获知屏幕上鼠标位置的单词或汉字,并翻译出来提示用户。
它对於上网浏览、在线阅读外文文章等很有帮助作用,因此许多词典软件都提供了屏幕抓词功能。
屏幕抓词的关键是如何获得鼠标位置的字符串,Windows的动态链接和消息响应机制为之提供了实现途径。
概括地说,主要通过下面的几个步骤来取得屏幕上鼠标位置的字符串:符串:. 代码拦截:Windows以DLL方式提供系统服务,可以方便地获取Windows字符输出API的地址,修改其入口代码,拦截应用程序对它们的调用。
. 鼠标HOOK:安装WH-MOUSEPROC类型的全局鼠标HOOK过程,监视鼠标在整个屏幕上的移动。
. 屏幕刷新:使鼠标周围一块区域无效,并强制鼠标位置的窗口刷新屏幕输出。
窗口过程响应WM-NCPAINT和WM-PAINT消息,调用ExtTextOut/TextOut等字符输出API更新无效区域里面的字符串。
这些调用被我们截获,从堆栈里取得窗口过程传给字符API的参数,如字符串地址、长度、输出坐标、HDC、裁剪区等信息。
2Windows 95/98的字符输出方法Windows95/98不是一个纯32位的操作系统,它从16位操作系统发展而来,为了保持兼容,其内部仍然是32位和16位代码的混合体。
系统通过gdi.exe 、user.exe和krnl386.exe提供16位API,供16位程序调用;通过gdi32.dll、user32.dll和kernel32.dll 提归结如下:图1Windows 95/98的字符输出机制. 16位程序通过16位gdi.exe的ExtTextOut/TextOut函数输出字符;. 32位程序通过gdi32.dll的ExtTextOutA/TextOutA输出ANSI格式的字符,通过ExtTextOutW/TextOutW输出UNICODE格式的字符;. 32位的ExtTextOutA/TextOutA转换到16位的ExtTextOut/TextOut,完成ANSI 格式字符的输出;. 32位的ExtTextOutW/TextOutW转换到16位gdi.exe的两个未公开API,完成UNICODE格式字符的输出。
钩子函数大全
钩子函数大全DelHookProc :该函数已过时,它仅仅是用来与Windows的16位版本兼容.在32位Windows系统中应当使用函数CallNextHookEx. SetWindowsHook :该函数已过时,它仅仅是用来与Windows的16位版本兼容.在32位Windows系统中应当使用函数SetWindowsHookEx. UnhookWindowsHook :该函数已过时,它仅仅是用来与Windows的16位版本兼容.在32位Windows系统中应当使用函数UnhookWindowsHookEx.KBDLLHOOKSTRUCT结构DWORD vkCode; //键盘消息的虚拟键信息,值的范围从1至254DWORD scanCode; //键盘的扫描码信息DWORD flags; //键盘的扩展信息DWORD time; //消息的产生时间,可以用 GetMessageTime 函数取得ULONG_PTR dwExtraInfo; //消息的扩展信息DEBUGHOOKINFO结构DWORD idThread; //filter 线程的IDDWORD idThreadInstaller; //debugging filter 线程的IDLPARAM lParam; //描述跳过此钩子程序要传递给Debug程序的 lParamWPARAM wParam; //描述跳过此钩子程序要传递给Debug程序的 wParamint code; //描述跳过此钩子程序要传遵给Debug程序的 nCodeMOUSEHOOKSTRUCT结构POINT pt; //发送鼠标消息时候的鼠标坐标HWND hwnd; //接收鼠标消息的窗口句柄UINT wHitTestCode; //测试码ULONG_PTR dwExtraInfo; //鼠标消息的扩展信息EVENTMSG结构UINT message;//描述消息UINT paramL;//消息的扩展信息UINT paramH;//消息的扩展信息DWORD time; //寄送消息的时间HWND hwnd;//接受消息的窗口句柄CWPSTRUCT 结构LPARAM lParam; //消息的扩展信息WPARAM wParam; //消息的扩展信息UINT message; //消息HWND hwnd; //接受消息的窗口MSLLHOOKSTRUCT结构POINT pt; //发送鼠标消息时候的鼠标坐标DWORD mouseData; //如果这个消息是 WM_MOUSEWHEEL 则高位为滚轮的滚动数目,低位保留.如果这个消息是 WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK,WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, 或 WM_NCXBUTTONDBLCLK.则高位描述的是X按钮是按下还是释放,低位保留DWORD flags; //描述消息的注入事件DWORD time; //描述寄送消息的时候ULONG_PTR dwExtraInfo;//描述消息的扩展信息CREATESTRUCT结构LPVOID lpCreateParams 将被用于创建窗口的数据的指针。
(完整word版)常用的十三种hook类型
本文将试图以下面的顺序讲解HOOK的大部分内容:1、 WINDOWS的消息机制2、 HOOK介绍3、 HOOK链4、 HOOK钩子的作用范围5、 HOOK类型6、回调函数7、 HOOK钩子的安装与卸载8、 HOOK实例演示+++++++++++++++++++WINDOWS的消息机制+++++++++++++++++++Windows系统是以消息处理为其控制机制,系统通过消息为窗口过程(windowsprocedure)传递输入。
系统和应用两者都可以产生消息。
对于每个输入事件,例如用户按下了键盘上的某个键、移动了鼠标、单击了一个控件上的滚动条,等等,系统都将产生一系列消息。
此外,对于应用带给系统的变化,如字体资源的改变、应用本身窗口的改变,系统都将通过消息以响应这种变化。
应用通过产生消息指示应用的窗口完成特定的任务,或与其他应用的窗口进行通信。
每个窗口都有一个处理Windows系统发送消息的处理程序,称为窗口程序。
它是隐含在窗口背后的一段程序脚本,其中包含对事件进行处理的代码。
Windows系统为每条消息指定了一个消息编号,例如当一个窗口变为活动窗口时,它事实上是收到一条来自Windows系统的WM_ACTIVATE消息,该消息的编号为6,它对应于VB窗口的Activate事件。
对于窗口来说,诸如Open、Activate、MouseDown、Resize等事件,实际上对应的是窗口内部的消息处理程序,这些程序对于用户来讲是不可见的。
类似地,命令按钮也有消息处理程序,它的处理程序响应诸如WM_LBUTTONDOWN和WM_RBUTTONDOWN之类的消息,即激活命令按钮的MouseDown事件.WINDOWS的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种回调函数(HOOK)的功能.这种挂钩函数(HOOK)类似扩充中断驱动程序,挂钩上可以挂接多个反调函数构成一个挂接函数链.系统产生的各种消息首先被送到各种挂接函数,挂接函数根据各自的功能对消息进行监视、修改和控制等,然后交还控制权或将消息传递给下一个挂接函数以致最终达到窗口函数。
WindowsHook(钩子)函数详解讲述
Windows Hook(钩子)函数详解目录钩子类型 (2)WH_MSGFILTER(MessageProc) (2)WH_JOURNALRECORD(JournalRecordProc) (3)WH_JOURNALPLAYBACK(JournalPlaybackProc) (4)WH_KEYBOARD(KeyboardProc) (6)WH_GETMESSAGE(GetMsgProc) (8)WH_CALLWNDPROC(CallWndProc) (9)WH_CBT(CBTProc) (10)WH_SYSMSGFILTER(SysMsgProc) (13)WH_MOUSE(MouseProc) (14)WH_DEBUG (DebugProc) (15)WH_SHLL(ShellProc) (16)WH_FOREGROUNDIDLE(ForegroundIdleProc) (17)WH_CALLWNDPROCRET(CallWndRetProc) (18)WH_KEYBOARD_LL (LowLevelKeyboardProc) (19)WH_MOUSE_LL (LowLevelMouseProc) (21)WH_SYSMSGFILTER和WH_MSGFILTER (CallMsgFilter) (22)相关函数 (23)SetWindowsHookEx (23)SetWindowsHook (25)UnhookWindowsHookEx (26)DelHookProc: (26)UnhookWindowsHook (26)CallNextHookEx (26)钩子类型WH_MSGFIL TER(MessageProc)函数功能:挂钩处理过程是应用程序或库中定义的回调函数,它与函数SetWindowsHookEx搭配使用.当一个对话框、消息框、菜单条、或滚动条中的输入事件发生,且由此引发的消息尚未被处理之前,系统对此挂钩处理过程进行调用.此函数可以对一个特定应用程序或所有应用程序的对话框、消息框、菜单条、或滚动引发的条消息进行监视.类型HOOKPROC定义了指向此类回调函数的指针. MessageProc 是库中相应回调函数名的位置标志符.函数原形:LRESULT CALLBACK MessageProc(int code,WPARAM wParam,LPARAM lParam);参数:nCode:指示产生此消息的输入事件类型.此参数可以是以下值之一:若nCode的值小于0,则此挂钩处理过程必须将该消息不加处理地传送给函数wParam:为NULL(0).lParam:指向MSG结构的[指针].返回值:若nCode的值小于0,则此挂钩处理过程必须返回CallNextHookEx 的返回值.若nCode的值大于或等于0,并且此挂钩处理过程未对该消息进行处理,则调用函数CallNextHookEx 并返回其返回值是被推荐的.否则,其他安装了WH_MSGFILTER挂钩的应用程序将无法收到此挂钩通知,并可能由此导致错误的行为.若此挂钩处理过程处理了此消息,它应返回一个非0值以避免系统再将此消息传送给挂钩链上的其他挂钩处理过程或目标窗口处理过程.备注:一个应用程序通过调用函数SetWindowsHookEx指定WH_MSGFILTER挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.若一个应用程序使用了DDEML并实行同步处理,而且要求必须在消息被分派前处理之,则一定要使用WH_MSGFILTER挂钩.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:用户自定义.WH_JOURNALRECORD(JournalRecordProc)函数功能:该函数处理过程是应用程序或库定义的回调函数, 它与函数SetWindowsHookEx搭配使用,此函数纪录系统从系统消息队列中删除的消息,此后,一个应用程序可以通过使用挂钩处理过程JournalPlaybackProc对此消息进行回调.类型HOOKPROC定义了指向此类回调函数的指针, JournalRecordProc是应用程序定义或库定义的相应回调函数名的位置标识符.函数原形:LRESULT CALLBACK JournalRecordProc(int code,WPARAM wParam,LPARAM lParam);参数:Code:若nCode之值小于0,此挂钩处理过程必须将此消息不加处理地传送给函数CallNextHookEx 并返回其返回值.wParam:指定为NULL(0).lParam:指向结构EVENTMSG ,该结构包含将被纪录的消息.返回值:返回值被忽略.备注:一个JournalRecordProc挂钩处理过程必须拷贝但不能修改此消息,在次挂钩处理过程控制交还给系统之后,此消息继续被处理.安装一个JournalRecordProc挂钩处理过程是通过调用函数SetWindowsHookEx指定WH_JOURNALRECORD挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.过程并非只能存在于动态链接库中,一个应用程序自身也可拥有自己的JournalRecordProc挂钩处理过程.与其余大多数全局挂钩处理过程不同,挂钩处理过程JournalRecordProc和JournalPlaybackProc 总是在设置了该挂钩的线程上下文中被调用.一个安装了JournalRecordProc挂钩处理过程的应用程序该对虚拟键VK_CANCEL进行监视(在大多数键盘上,虚拟键VK_CANCEL被实现为组合键< CTRL+BREAK>),此虚拟键应被应用程序解释为用户希望终止进行日志纪录的信号,而应用程序对此进行响应,结束相应的纪录序列,并删除挂钩处理过程JournalRecordProc,在这里,删除挂钩处理过程是很重要的,此举使得应用程序免于因为在一个挂钩处理过程内部被挂起而将系统锁住.这种作为终止日志纪录信号的角色使得组合键<CTRL+BREAK>本身无法被纪录,而组合键<CTRL+C>并不充当日志纪录信号的角色,所以可以被纪录,这里还有两种组合键是不能被纪录的:即<CTRL+ESC> 和<CTRL+ALT+DEL>,这两组组合键导致系统终止所有的日志活动(纪录或回调),删除所有的日志挂钩,并将消息WM_CANCELJOURNAL寄送给日志应用程序.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:用户定义WH_JOURNALPLAYBACK(JournalPlaybackProc)函数功能:该函数处理过程是应用程序或库定义的回调函数, 它与函数SetWindowsHookEx搭配使用.典型地,一个应用程序通过调用此函数来对先前有JournalRecordProc挂钩处理过程纪录的一系列鼠标和键盘消息进行回放.一旦挂钩函数JournalPlaybackProc挂钩处理过程被安装,则通常的鼠标和键盘输入被禁止.类型HOOKPROC定义了指向此类回调函数的指针, JournalPlaybackProc是应用程序定义或库定义的相应回调函数名的位置标识符.函数原形:LRESULT CALLBACK JournalPlaybackProc(int code, WPARAM wParam, LPARAM lParam);参数:code::若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值.wParam:指示一个NULL(0)值lParam:指向一个EVENTMSG结构,该结构反映了正被此挂钩处理函数处理的消息,这个参数仅当参数nCode的值是HC_GETNEXT时才有效.返回值:为使系统在处理此消息之前先等待一段时间,返回值必须为一个以时钟计的时间量,该时间量指出了系统的等待时间长短.(此时间量可通过计算当前输入的消息与上一个输入消息的time 成员的差别获得),若希望立即处理此消息,返回值应为0,此返回值仅当挂钩代码为HC_GETNEXT时才被使用,否则,此返回值被忽略.备注:一个JournalPlaybackProc挂钩处理过程应当将输入消息拷贝给lParam参数,此消息必须是在先前使用JournalRecordProc 挂钩处理过程时被纪录过的,在使用JournalRecordProc挂钩处理过程时,不应对此消息进行修改,为了多次获得相同的消息,此挂钩处理过程可以多次以HC_GETNEXT为参数被调用.若nCode的值为HC_GETNEXT而返回值大于0,则系统按返回值指定的毫秒值进入睡眠状态,当系统开始继续执行时,它会以HC_GETNEXT为参数nCode的值再次调用次挂钩处理过程以获得相同的消息,此次调用JournalPlaybackProc的返回值为0,否则,系统又将回到睡眠状态,并以此次调用JournalPlaybackProc返回的毫秒数为睡眠时间,睡眠时间到后再重复上述操作.这就使得系统表现为被挂起.与其余大多数全局挂钩处理过程不同,挂钩处理过程JournalRecordProc和JournalPlaybackProc 总是在设置了该挂钩的线程上下文中被调用.在此挂钩处理过程将控制返回给系统后,此消息继续被处理.若nCode的值为HC_SKIP,则此挂钩处理过程必须准备在它下一次被调用时返回下一个纪录了的事件消息,安装JournalPlaybackProc挂钩处理过程通过调用函数SetWindowsHookEx,指定WH_JOURNALPLAYBACK挂钩类型及相应挂钩处理过程首地址来实现,如果用在日志回调过程中按下<Ctrl+Esc>或<Ctrl+Alt+Del>组合键,系统将终止回调,取消此日志回调过程,并寄送一个WM_CANCELJOURNAL消息给日志应用程序.若此挂钩处理过程返回的消息在WM_KEYFIRST 或WM_KEYLAST的范围内,则以下情形发生.结构EVENTMSG的paramL成员指示按下的虚拟键编码值,结构EVENTMSG的paramH成员指示扫描吗,这种情况下无法指示出重复按键的次数,这个事件仅表示一个按键事件.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:用户定义.WH_KEYBOARD(KeyboardProc)函数功能:该函数是应用程序或库文件定义的回调函数, 它与函数SetWindowsHookEx搭配使用,当应用程序调用函数GetMessage 或PeekMessage 并且当前恰好有一个键盘消息(WM_KEYUP or WM_KEYDOWN) 将要被处理时,系统就调用此挂钩处理过程.类型HOOKPROC定义了指向此类回调函数的指针, KeyboardProc是应用程序定义或库定义的相应回调函数名的位置标识符.函数原形:LRESULT CALLBACK KeyboardProc(int code,LPARAM lParam);参数:code:指定一个代码,该代码被挂钩处理过程用于决定如何处理此消息,此参数可以为以下值之一:并返回其返回值.wParam:按键的虚拟键值消息,例如:VK_F1lParam:指示重复次数,扫描码,扩展标志,上下文代码,此前的键状态标志和变化状态标志,此参数可以返回值:若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,并且此挂钩处理过程并未对此消息进行处理,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了挂钩WH_KEYBOARD的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩处理过程对此消息进行了处理,它应返回非0值以避免系统将此消息传递给挂钩键上的其他处理过程或目标窗口的处理过程.备注:一个应用程序通过调用函数SetWindowsHookEx指定WH_KEYBOARD挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:用户自定义.WH_GETMESSAGE(GetMsgProc)函数功能:该函数处理过程是应用程序或库定义的回调函数, 它与函数SetWindowsHookEx搭配使用,每当函数GetMessage从应用程序的消息队列中获得了一个消息时,系统就调用此函数,在将此获得的消息传送给相应窗口处理过程之前,系统将此消息传送给该挂钩处理过程.类型HOOKPROC定义了指向此类回调函数的指针, GetMsgProc是应用程序定义或库定义的相应回调函数名的位置标识符.函数原形:LRESULT CALLBACK GetMsgProc(int code,WPARAM wParam,LPARAM lParam );参数:Code:指示挂钩处理过程是否必须处理此消息.若nCode的值是HC_ACTION,则挂钩处理过程必须处理此消息,若nCode之值小于0,此挂钩处理过程必须将此消息不加处理地传送给函数CallNextHookEx并返回其返回值.wParam:指示此消息是否已从消息队列中被删除,此参数可以是以下值之一:lParam:指向结构MSG,该结构包含了关于此消息的详细消息返回值:若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了挂钩WM_GETMESSAGE的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩处理过程没有调用函数CallNextHookEx,则返回值为0.备注:挂钩处理过程GetMsgProc可以检查和修改此消息,在此挂钩处理过程将控制返回给系统之后,函数GetMessage将此修改后的消息返回给最初调用他的应用程序,应用程序通过调用函数SetWindowsHookEx指定WH_GETMESSAGE挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:用户定义.WH_CALLWNDPROC(CallWndProc)函数功能:该函数挂钩处理过程是由应用程序定义或由库定义的回调函数,它与函数SetWindowsHookEx配套使用,系统调用此函数无论何时一旦函数SendMessage被调用,在将消息发送至相应的窗口处理过程之前,系统先将该消息发送至挂钩处理过程,该挂钩处理过程可以对改消息进行检查,但不能修改之.类型HOOKPROC定义了指向此类回调函数的指针,CallWndProc是应用程序定义或库定义的函数名的位置标志位.函数原形:LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam );参数:nCode:指定该挂钩处理过程是否必须对该消息进行处理,若nCode 是HC_ACTION,则该挂钩处理过程必须处理该消息.若nCode的值小于0,则此挂钩处理过程必须在未对该消息作进一步处理的情况下,将其发送给函数CallNextHookEx并返回由CallNextHookEx返回的值.wParam:指示该消息是否由当前线程发出,若该消息由当前线程发出,其值为非0值,否则,其值为0. lParam:指向一个CWPSTRUCT结构,该结构包含了此消息的详细消息.返回值:若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了WM_CALLWNDPROC挂钩的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩没有调用函数CallNextHookEx,则返回值为0.备注:挂钩处理函数CallWndPro可以对消息进行检查,但不能修改之.在该挂钩处理过程将控制返回给系统之后,该消息被发送至相应的窗口过程.一个应用程序通过调用SetWindowsHookEx时指定WM_CALLWNDPROC挂钩类型及其相应挂钩处理过程的首地址来安装挂钩处理过程.挂钩WM_CALLWNDPROC是在调用函数SendMessage的线程中被调用的,它并非在接受消息的线程中被调用.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:用户定义.WH_CBT(CBTProc)函数功能:该函数挂钩处理过程是在应用程序或库中定义的回调函数,它与函数SetWindowsHookEx配套使用,系统在缉获、创建、销毁、最小化、最大化、移动或改变一个窗口尺寸之前调用它;在结束一个系统命令之前调用它;在将一个鼠标或键盘事件从系统事件队列中删除之前调用它;在设置键盘焦点之前调用它,或在与系统消息队列进行同步之前调用它,一个基于计算机培训(CBT)的应用程序使用此挂钩处理过程来从系统接收有用的通知.类型HOOKPROC定义了指向此类回调函数的指针,CBTProc是应用程序定义或库定义的相应回调函数名的位置标识符.函数原形:LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam);参数:nCode:指定一个代码,该代码被此挂钩处理过程用来决定如何处理此消息,该参数可以是下值中的一个:若nCode的值小于0,此挂钩处理过程必须不加处理地将此消息发送给函数CallNextHookEx,并返回函数CallNextHookEx的返回值.wParam:取决于参数nCode的值,详细信息参见以下的说明部分.lParam:取决于参数nCode的值,详细信息参见以下的说明部分.返回值:此挂钩处理过程的返回值决定了系统允许或禁止以下操作之一,对于与以下挂钩代码相应的操作,返回值为0则允许这样的操作,返回值为1则禁止.●HCBT_ACTIVATE●HCBT_CREATEWNDHCBT_DESTROYWND●HCBT_MINMAX●HCBT_MOVESIZEHCBT_SETFOCUS●HCBT_SYSCOMMAND对于与以下CBT挂钩代码相对应的操作,返回值被忽略.●HCBT_CLICKSKIPPED●HCBT_KEYSKIPPED●HCBT_QS备注:除以下挂钩代码之外,不应当安装WH_JOURNALPLAYBACK挂钩处理过程.此挂钩处理过程必须放在某个动态链接库中,一个应用程序通过调用函数SetWindowsHookEx指定WH_CBT 挂钩类型与相应挂钩处理过程首地址来安装挂钩处理过程.以下列示了参数wParam和lParam与每一种HCBT挂钩代码的关系.HCBT_ACTIVATEwParam:指定被激活窗口句柄。
Delphi 中的消息钩子函数和Windows子类处理
首先我们先看一下安装HOOK的函数:HHOOK SetWindowsHookEx(int idHook,//要安装的HOOK的类型HOOKPROC lpfn, //HOOK的回调函数HINSTANCE hMod,//进程DWORD dwThreadId //程序的线程,如果为0则是全局HOOK);熟悉了SetWindowsHookEx函数,我们就能开始我们的工作,挂钩进程。
首先打开Delphi,创建一个DLL工程(DLL Wizard)。
然后创建一个新的单元(Unit1)。
首先在单元的interface 下面声明要用到的函数。
varOldHook:HHOOK;Histance:HISTANCE;OldProc:FARPROC;我们的第一个函数是安装HOOK,让我们看一下代码:Function SetHook:Boolean;stdcall;beginOldHook:=SetWindowsHookEx(WH_KEYBOARD,@HookProc,Histance,0);if (OldHook=0) then exit else Result:=True;end;这样的话就安装一个全局的键盘HOOK,HOOK的方法还有很多,在此就不一一列举了。
下面介绍一下回调函数:Function HookProc(nCode,wParam,lParam:Integer);Integer;stdcall;beginResult:=CallNextHookEx(OldHook,nCode,wParam,lParam);end;这样的话就完成了对进程的挂钩。
可是挂上钩我们的工作并没结束,相反,我们的工作才刚刚开始。
钩子的作用是帮我们把DLL注入到别人的进程空间。
现在我们的DLL已经在别人的进程空间内。
所以,我们就可以做我们想做的事。
下面介绍一下Windows的子类化处理。
大家都知道,在windows里不管你做了什么事,都会向windows发送一条消息,然后由Windows作出相应的处理后才会返回给传送消息的应用程序。
钩子函数使用
动态链接库。但是当钩子函数在得到了控制权,并对相关的事件处理完后,如果想要该消息得以继续的传递,那么则必须调用另一个函数:CallNextHookEx。
由于系统必须对每个消息处理,钩子程序因此增加了处理的负担,因此也降低了系统的性能。鉴于这一点,在windows ce中对钩子程序并不支持。所以当程序完成并退出时,
应当释放钩子,调用函数:UnhookWindowsHookEx。
下面我们将举一个例子(捕捉键盘)来详细的讲解钩子函数的程序设计。
三:程序的设计:
键盘敲打消息的信息,并且,键盘敲打消息一直没有从消息队列中删除。(应用程序调用PeekMessage函数,并且设置PM_NOREMOVE标志)。也就是说当nCode等于HC_ACTION时,
钩子进程必须处理消息。而为HC_NOREMOVE时,钩子进程必须传递消息给CallNextHookEx函数,而不能做进一步的处理,而且必须有CallNextHookEx函数的返回值。
}
DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam )
{
WPARAM j;
FILE *fp;
if(lParam&0x80000000)
{
j = wParam;
fp=fopen("c:\\hook\\key.txt","a");
DllExport void EndHook(void);
Hook(钩子技术)基本知识讲解,原理
Hook(钩⼦技术)基本知识讲解,原理⼀、什么是HOOK(钩⼦) APIWindows消息传递机制,当在应⽤程序进⾏相关操作,例如点击⿏标、按下键盘,操作窗⼝等,操作系统能够感知这⼀事件,接着把此消息放到系统消息队列,然后到应⽤程序的消息序列中,应⽤程序通过Getmessage函数取出消息,然后调⽤DispatchMessage函数将这条消息调度给操作系统,操作系统会调⽤在设计窗⼝类时指定的应⽤程序窗⼝对这⼀消息进⾏处理,处理过程如图所⽰:在《VC深⼊详解》⼀书将钩⼦过程⽐喻为警察为了抓逃犯⽽设置的检查站,基本原理也确实与此类似。
就是在应⽤程序将信息传递给操作系统时(图中③的),对消息进⾏捕获和过滤,从⽽阻⽌消息发送到指定的窗⼝过程,最终完成对某些消息的屏蔽功能。
HOOK(钩⼦,挂钩)是⼀种实现Windows平台下类似于中断的机制。
HOOK机制允许应⽤程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达⽬标窗⼝之前将其捕获,从⽽得到对消息的控制权,进⽽可以对该消息进⾏处理或修改,加⼊我们所需的功能。
钩⼦按使⽤范围分,可分为线程钩⼦和系统钩⼦,其中,系统钩⼦具有相当⼤的功能,⼏乎可以实现对所有Windows消息的拦截、处理和监控。
这项技术涉及到两个重要的API,⼀个是SetWindowsHookEx,安装钩⼦;另⼀个是UnHookWindowsHookEx,卸载钩⼦。
对于Windows系统,它是建⽴在事件驱动机制上的,说⽩了就是整个系统都是通过消息传递实现的。
hook(钩⼦)是⼀种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往⽬标窗⼝的消息并进⾏处理。
所以说,我们可以在系统中⾃定义钩⼦,⽤来监视系统中特定事件的发⽣,完成特定功能,如屏幕取词,监视⽇志,截获键盘、⿏标输⼊等等。
程序员在讨论时也常说“可以先钩住再处理”,即执⾏某操作之前,优先处理⼀下,再决定后⾯的执⾏⾛向。
HOOK基础知识总结
HOOK基础知识总结1、基本概念钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。
当消息到达后,在目标窗口处理函数之前处理它。
钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。
每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。
这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
Hook API是指Windows开放给程序员的编程接口,使得在用户级别下可以对操作系统进行控制,也就是一般的应用程序都需要调用API来完成某些功能,Hook API的意思就是在这些应用程序调用真正的系统API前可以先被截获,从而进行一些处理再调用真正的API来完成功能。
HOOK分为三种:LOCAL HOOK 和 REMOTE HOOK,还有一种是SYSTEM‐WIDE LOCAL HOOK。
LOCAL HOOK就是指程序HOOK的就是本程序中的线程。
REMOTE HOOK有两种形式:一种是对其他程序中某个特定的线程;一种是对整个系统。
SYSTEM–WIDE LOCAL HOOK 是一种比较特殊的。
它具有REMOTE HOOK的功能,又可以用LOCAL HOOK 的表现手法,实际上就是WH_JOURNALRECORD和WH_JOURNALPLAYBACK两种HOOK。
REMOTE HOOK 必须封装在DLL 中。
这是因为REMOTE HOOK是针对整个系统或其他进程的线程,因此HOOK必须封装成DLL,才可以植入到其他进程进行监控。
而SYSTEM‐WIDE LOCAL HOOK采用的是另外一种架构,系统中的线程请求或获得一个硬件消息的话,系统会调用那个安装有HOOK的线程,并执行它的FILTER FUNCTION.然后再返回给请求硬件消息的线程。
setwindowshook函数说明
setwindowshook函数说明setwindowshook函数说明setwindowshook函数是Windows操作系统提供的一种底层钩子技术,允许应用程序拦截和监视特定的系统事件。
本文将详细介绍setwindowshook函数的使用方法和注意事项。
1. setwindowshook函数的定义HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);2. 参数解释•idHook:钩子类型,指定所要安装的钩子类型,常见的钩子类型包括WH_KEYBOARD、WH_MOUSE等。
•lpfn:回调函数的指针,当特定事件发生时,系统会调用该回调函数。
•hMod:钩子处理函数所在的模块句柄,一般使用GetModuleHandle(NULL)获取当前模块句柄。
•dwThreadId:线程ID,指定钩子函数所在的线程ID。
如果为0,则表示将钩子函数安装到所有线程。
3. 使用示例下面是一个钩取鼠标消息的例子:LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {// 鼠标钩子处理函数// ...return CallNextHookEx(NULL, nCode, wParam, lParam);}int main() {HINSTANCE hInstance = GetModuleHandle(NULL);HHOOK hHook = SetWindowsHookEx(WH_MOUSE, MouseProc, hInstance, 0);if (hHook != NULL) {// 钩子安装成功,可以进行处理MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}UnhookWindowsHookEx(hHook); // 卸载钩子}return 0;}4. 注意事项•钩子函数需要放在动态链接库(DLL)中,以便被注入到其他进程中。
VC消息钩子详细解释
VC消息钩子详细解释Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。
而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。
钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。
这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
可见,利用钩子可以实现许多特殊而有用的功能。
因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。
钩子的类型一.按事件分类,有如下的几种常用类型(1)键盘钩子和低级键盘钩子可以监视各种键盘消息。
(2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。
(3)外壳钩子可以监视各种Shell事件消息。
比如启动和关闭应用程序。
(4)日志钩子可以记录从系统消息队列中取出的各种事件消息。
(5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。
此外,还有一些特定事件的钩子提供给我们使用,不一一列举。
下面描述常用的Hook类型:1、WH_CALLWNDPROC和WH_CALLWNDPROCRET HooksWH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。
系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子程。
WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构,再传递到Hook子程。
CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。
2、WH_CBT Hook在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;2. 完成系统指令;3. 来自系统消息队列中的移动鼠标,键盘事件;4. 设置输入焦点事件;5. 同步系统消息队列事件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
windows消息大全及钩子介绍windows消息大全 (2)声明 (2)消息中有什么? (2)通知消息 (23)按扭 (23)组合框 (23)编辑框 (24)列表框 (24)Windows消息中的虚拟键列表 (25)Windows消息中的虚拟键 (25)DirectInput中的虚拟键 (27)HOOK专题 (29)基本概念 (29)运行机制 (30)1、钩子链表和钩子子程: (30)2、钩子的安装与释放: (31)3、一些运行机制: (33)4、系统钩子与线程钩子: (34)钩子类型 (35)1、WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks (35)2、WH_CBT Hook (35)3、WH_DEBUG Hook (36)4、WH_FOREGROUNDIDLE Hook (36)5、WH_GETMESSAGE Hook (36)6、WH_JOURNALPLAYBACK Hook (36)7、WH_JOURNALRECORD Hook (37)8、WH_KEYBOARD Hook (37)9、WH_KEYBOARD_LL Hook (37)10、WH_MOUSE Hook (37)11、WH_MOUSE_LL Hook (37)12、WH_MSGFILTER 和WH_SYSMSGFILTER Hooks (38)13、WH_SHELL Hook (38)windows消息大全消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。
例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。
消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。
例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。
这个记录类型叫做TMsg,声明它在Windows单元中是这样声明的:typeTMsg = packed recordhwnd: HWND; / /窗口句柄message: UINT; / /消息常量标识符wParam: WPARAM ; // 32位消息的特定附加信息lParam: LPARAM ; // 32位消息的特定附加信息time: DWORD; / /消息创建时的时间pt: TPoint; / /消息创建时的鼠标位置end;消息中有什么?是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:hwnd 32位的窗口句柄。
窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。
message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。
wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。
lParam 通常是一个指向内存中数据的指针。
由于W P a r a m、l P a r a m和P o i n t e r 都是3 2位的,因此,它们之间可以相互转换。
WM_NULL = $0000;WM_CREATE = $0001;应用程序创建一个窗口WM_DESTROY = $0002;一个窗口被销毁WM_MOVE = $0003;移动一个窗口WM_SIZE = $0005;改变一个窗口的大小WM_ACTIVATE = $0006;一个窗口被激活或失去激活状态;WM_SETFOCUS = $0007;获得焦点后WM_KILLFOCUS = $0008;失去焦点WM_ENABLE = $000A;改变enable状态WM_SETREDRAW = $000B;设置窗口是否能重画WM_SETTEXT = $000C;应用程序发送此消息来设置一个窗口的文本WM_GETTEXT = $000D;应用程序发送此消息来复制对应窗口的文本到缓冲区WM_GETTEXTLENGTH = $000E;得到与一个窗口有关的文本的长度(不包含空字符)WM_PAINT = $000F;要求一个窗口重画自己WM_CLOSE = $0010;当一个窗口或应用程序要关闭时发送一个信号WM_QUERYENDSESSION = $0011;当用户选择结束对话框或程序自己调用ExitWindows函数WM_QUIT = $0012;用来结束程序运行或当程序调用postquitmessage函数WM_QUERYOPEN = $0013;当用户窗口恢复以前的大小位置时,把此消息发送给某个图标WM_ERASEBKGND = $0014;当窗口背景必须被擦除时(例在窗口改变大小时)WM_SYSCOLORCHANGE = $0015;当系统颜色改变时,发送此消息给所有顶级窗口WM_ENDSESSION = $0016;当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束WM_SYSTEMERROR = $0017;WM_SHOWWINDOW = $0018;当隐藏或显示窗口是发送此消息给这个窗口WM_ACTIVATEAPP = $001C;发此消息给应用程序哪个窗口是激活的,哪个是非激活的;WM_FONTCHANGE = $001D;当系统的字体资源库变化时发送此消息给所有顶级窗口WM_TIMECHANGE = $001E;当系统的时间变化时发送此消息给所有顶级窗口WM_CANCELMODE = $001F;发送此消息来取消某种正在进行的摸态(操作)WM_SETCURSOR = $0020;如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口WM_MOUSEACTIVATE = $0021;当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口WM_CHILDACTIVATE = $0022;发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小WM_QUEUESYNC = $0023;此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序分离出用户输入消息WM_GETMINMAXINFO = $0024;此消息发送给窗口当它将要改变大小或位置;WM_PAINTICON = $0026;发送给最小化窗口当它图标将要被重画WM_ICONERASEBKGND = $0027;此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画WM_NEXTDLGCTL = $0028;发送此消息给一个对话框程序去更改焦点位置WM_SPOOLERSTATUS = $002A;每当打印管理列队增加或减少一条作业时发出此消息WM_DRAWITEM = $002B;当button,combobox,listbox,menu的可视外观改变时发送此消息给这些空件的所有者WM_MEASUREITEM = $002C;当button, combo box, list box, list view control, or menu item 被创建时发送此消息给控件的所有者WM_DELETEITEM = $002D;当the list box 或combo box 被销毁或当某些项被删除通过LB_DELETESTRING, LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT 消息WM_VKEYTOITEM = $002E;此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息WM_CHARTOITEM = $002F;此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息WM_SETFONT = $0030;当绘制文本时程序发送此消息得到控件要用的颜色WM_GETFONT = $0031;应用程序发送此消息得到当前控件绘制文本的字体WM_SETHOTKEY = $0032;应用程序发送此消息让一个窗口与一个热键相关连WM_GETHOTKEY = $0033;应用程序发送此消息来判断热键与某个窗口是否有关联WM_QUERYDRAGICON = $0037;此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标WM_COMPAREITEM = $0039;发送此消息来判定combobox或listbox新增加的项的相对位置WM_GETOBJECT = $003D;WM_COMPACTING = $0041;显示内存已经很少了WM_WINDOWPOSCHANGING = $0046;发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数WM_WINDOWPOSCHANGED = $0047;发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数WM_POWER = $0048;(适用于16位的windows)当系统将要进入暂停状态时发送此消息WM_COPYDATA = $004A;当一个应用程序传递数据给另一个应用程序时发送此消息WM_CANCELJOURNAL = $004B;当某个用户取消程序日志激活状态,提交此消息给程序WM_NOTIFY = $004E;当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口WM_INPUTLANGCHANGEREQUEST = $0050;当用户选择某种输入语言,或输入语言的热键改变WM_INPUTLANGCHANGE = $0051;当平台现场已经被改变后发送此消息给受影响的最顶级窗口WM_TCARD = $0052;当程序已经初始化windows帮助例程时发送此消息给应用程序WM_HELP = $0053;此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口WM_USERCHANGED = $0054;当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息;WM_NOTIFYFORMAT = $0055;公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE 结构在WM_NOTIFY消息,使用此控件能使某个控件与它的父控件之间进行相互通信WM_CONTEXTMENU = $007B;当用户某个窗口中点击了一下右键就发送此消息给这个窗口WM_STYLECHANGING = $007C;当调用SETWINDOWLONG函数将要改变一个或多个窗口的风格时发送此消息给那个窗口WM_STYLECHANGED = $007D;当调用SETWINDOWLONG函数一个或多个窗口的风格后发送此消息给那个窗口WM_DISPLAYCHANGE = $007E;当显示器的分辨率改变后发送此消息给所有的窗口WM_GETICON = $007F;此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄;WM_SETICON = $0080;程序发送此消息让一个新的大图标或小图标与某个窗口关联;WM_NCCREATE = $0081;当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送;WM_NCDESTROY = $0082;此消息通知某个窗口,非客户区正在销毁WM_NCCALCSIZE = $0083;当某个窗口的客户区域必须被核算时发送此消息WM_NCHITTEST = $0084;//移动鼠标,按住或释放鼠标时发生WM_NCPAINT = $0085;程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时;WM_NCACTIVATE = $0086;此消息发送给某个窗口仅当它的非客户区需要被改变来显示是激活还是非激活状态;WM_GETDLGCODE = $0087;发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件通过响应WM_GETDLGCODE消息,应用程序可以把他当成一个特殊的输入控件并能处理它WM_NCMOUSEMOVE = $00A0;当光标在一个窗口的非客户区内移动时发送此消息给这个窗口//非客户区为:窗体的标题栏及窗的边框体WM_NCLBUTTONDOWN = $00A1;当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息WM_NCLBUTTONUP = $00A2;当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息;WM_NCLBUTTONDBLCLK = $00A3;当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息WM_NCRBUTTONDOWN = $00A4;当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息WM_NCRBUTTONUP = $00A5;当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息WM_NCRBUTTONDBLCLK = $00A6;当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息WM_NCMBUTTONDOWN = $00A7;当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息WM_NCMBUTTONUP = $00A8;当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息WM_NCMBUTTONDBLCLK = $00A9;当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息WM_KEYFIRST = $0100;WM_KEYDOWN = $0100;//按下一个键WM_KEYUP = $0101;//释放一个键WM_CHAR = $0102;//按下某键,并已发出WM_KEYDOWN,WM_KEYUP消息WM_DEADCHAR = $0103;当用translatemessage函数翻译WM_KEYUP消息时发送此消息给拥有焦点的窗口WM_SYSKEYDOWN = $0104;当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口;WM_SYSKEYUP = $0105;当用户释放一个键同时ALT 键还按着时提交此消息给拥有焦点的窗口WM_SYSCHAR = $0106;当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口WM_SYSDEADCHAR = $0107;当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口WM_KEYLAST = $0108;WM_INITDIALOG = $0110;在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务WM_COMMAND = $0111;当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译WM_SYSCOMMAND = $0112;当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息WM_TIMER = $0113; //发生了定时器事件WM_HSCROLL = $0114;当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件WM_VSCROLL = $0115;当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件WM_INITMENU = $0116;当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单WM_INITMENUPOPUP = $0117;当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部WM_MENUSELECT = $011F;当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)WM_MENUCHAR = $0120;当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者;WM_ENTERIDLE = $0121;当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待WM_MENURBUTTONUP = $0122;WM_MENUDRAG = $0123;WM_MENUGETOBJECT = $0124;WM_UNINITMENUPOPUP = $0125;WM_MENUCOMMAND = $0126;WM_CHANGEUISTATE = $0127;WM_UPDATEUISTATE = $0128;WM_QUERYUISTATE = $0129;WM_CTLCOLORMSGBOX = $0132;在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色WM_CTLCOLOREDIT = $0133;当一个编辑型控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色WM_CTLCOLORLISTBOX = $0134;当一个列表框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色WM_CTLCOLORBTN = $0135;当一个按钮控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色WM_CTLCOLORDLG = $0136;当一个对话框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色WM_CTLCOLORSCROLLBAR= $0137;当一个滚动条控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色WM_CTLCOLORSTATIC = $0138;当一个静态控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色WM_MOUSEFIRST = $0200;WM_MOUSEMOVE = $0200;// 移动鼠标WM_LBUTTONDOWN = $0201;//按下鼠标左键WM_LBUTTONUP = $0202;//释放鼠标左键WM_LBUTTONDBLCLK = $0203;//双击鼠标左键WM_RBUTTONDOWN = $0204;//按下鼠标右键WM_RBUTTONUP = $0205;//释放鼠标右键WM_RBUTTONDBLCLK = $0206;//双击鼠标右键WM_MBUTTONDOWN = $0207;//按下鼠标中键WM_MBUTTONUP = $0208;//释放鼠标中键WM_MBUTTONDBLCLK = $0209;//双击鼠标中键WM_MOUSEWHEEL = $020A;当鼠标轮子转动时发送此消息个当前有焦点的控件WM_MOUSELAST = $020A;WM_PARENTNOTIFY = $0210;当MDI子窗口被创建或被销毁,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口WM_ENTERMENULOOP = $0211;发送此消息通知应用程序的主窗口that已经进入了菜单循环模式WM_EXITMENULOOP = $0212;发送此消息通知应用程序的主窗口that已退出了菜单循环模式WM_NEXTMENU = $0213;WM_SIZING = 532;当用户正在调整窗口大小时发送此消息给窗口;通过此消息应用程序可以监视窗口大小和位置也可以修改他们WM_CAPTURECHANGED = 533;发送此消息给窗口当它失去捕获的鼠标时;WM_MOVING = 534;当用户在移动窗口时发送此消息,通过此消息应用程序可以监视窗口大小和位置也可以修改他们;WM_POWERBROADCAST = 536;此消息发送给应用程序来通知它有关电源管理事件;WM_DEVICECHANGE = 537;当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序WM_IME_STARTCOMPOSITION = $010D;WM_IME_ENDCOMPOSITION = $010E;WM_IME_COMPOSITION = $010F;WM_IME_KEYLAST = $010F;WM_IME_SETCONTEXT = $0281;WM_IME_NOTIFY = $0282;WM_IME_CONTROL = $0283;WM_IME_COMPOSITIONFULL = $0284;WM_IME_SELECT = $0285;WM_IME_CHAR = $0286;WM_IME_REQUEST = $0288;WM_IME_KEYDOWN = $0290;WM_IME_KEYUP = $0291;WM_MDICREATE = $0220;应用程序发送此消息给多文档的客户窗口来创建一个MDI 子窗口WM_MDIDESTROY = $0221;应用程序发送此消息给多文档的客户窗口来关闭一个MDI 子窗口WM_MDIACTIVATE = $0222;应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口,当客户窗口收到此消息后,它发出WM_MDIACTIVE消息给MDI子窗口(未激活)激活它;WM_MDIRESTORE = $0223;程序发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小WM_MDINEXT = $0224;程序发送此消息给MDI客户窗口激活下一个或前一个窗口WM_MDIMAXIMIZE = $0225;程序发送此消息给MDI客户窗口来最大化一个MDI子窗口;WM_MDITILE = $0226;程序发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口WM_MDICASCADE = $0227;程序发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口WM_MDIICONARRANGE = $0228;程序发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口WM_MDIGETACTIVE = $0229;程序发送此消息给MDI客户窗口来找到激活的子窗口的句柄WM_MDISETMENU = $0230;程序发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单WM_ENTERSIZEMOVE = $0231;WM_EXITSIZEMOVE = $0232;WM_DROPFILES = $0233;WM_MDIREFRESHMENU = $0234;WM_MOUSEHOVER = $02A1;WM_MOUSELEAVE = $02A3;WM_CUT = $0300;程序发送此消息给一个编辑框或combobox来删除当前选择的文本WM_COPY = $0301;程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板WM_PASTE = $0302;程序发送此消息给editcontrol或combobox从剪贴板中得到数据WM_CLEAR = $0303;程序发送此消息给editcontrol或combobox清除当前选择的内容;WM_UNDO = $0304;程序发送此消息给editcontrol或combobox撤消最后一次操作WM_RENDERFORMAT = $0305;WM_RENDERALLFORMATS = $0306;WM_DESTROYCLIPBOARD = $0307;当调用ENPTYCLIPBOARD函数时发送此消息给剪贴板的所有者WM_DRAWCLIPBOARD = $0308;当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口;它允许用剪贴板观察窗口来显示剪贴板的新内容;WM_PAINTCLIPBOARD = $0309;当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重画;WM_VSCROLLCLIPBOARD = $030A;WM_SIZECLIPBOARD = $030B;当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者;WM_ASKCBFORMATNAME = $030C;通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字WM_CHANGECBCHAIN = $030D;当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口;WM_HSCROLLCLIPBOARD = $030E;此消息通过一个剪贴板观察窗口发送给剪贴板的所有者;它发生在当剪贴板包含CFOWNERDISPALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上;所有者应滚动剪贴板图象并更新滚动条的值;WM_QUERYNEWPALETTE = $030F;此消息发送给将要收到焦点的窗口,此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板WM_PALETTEISCHANGING= $0310;当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序WM_PALETTECHANGED = $0311;此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口,以此来改变系统调色板WM_HOTKEY = $0312;当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息WM_PRINT = 791;应用程序发送此消息仅当WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分;WM_PRINTCLIENT = 792;WM_HANDHELDFIRST = 856;WM_HANDHELDLAST = 863;WM_PENWINFIRST = $0380;WM_PENWINLAST = $038F;WM_COALESCE_FIRST = $0390;WM_COALESCE_LAST = $039F;WM_DDE_FIRST = $03E0;WM_DDE_INITIATE = WM_DDE_FIRST + 0;一个DDE客户程序提交此消息开始一个与服务器程序的会话来响应那个指定的程序和主题名;WM_DDE_TERMINATE = WM_DDE_FIRST + 1;一个DDE应用程序(无论是客户还是服务器)提交此消息来终止一个会话;WM_DDE_ADVISE = WM_DDE_FIRST + 2;一个DDE客户程序提交此消息给一个DDE服务程序来请求服务器每当数据项改变时更新它WM_DDE_UNADVISE = WM_DDE_FIRST + 3;一个DDE客户程序通过此消息通知一个DDE服务程序不更新指定的项或一个特殊的剪贴板格式的项WM_DDE_ACK = WM_DDE_FIRST + 4;此消息通知一个DDE(动态数据交换)程序已收到并正在处理WM_DDE_POKE,WM_DDE_EXECUTE, WM_DDE_DATA, WM_DDE_ADVISE, WM_DDE_UNADVISE, or WM_DDE_INITIAT消息WM_DDE_DATA = WM_DDE_FIRST + 5;一个DDE服务程序提交此消息给DDE客户程序来传递个一数据项给客户或通知客户的一条可用数据项WM_DDE_REQUEST = WM_DDE_FIRST + 6;一个DDE客户程序提交此消息给一个DDE服务程序来请求一个数据项的值;WM_DDE_POKE = WM_DDE_FIRST + 7;一个DDE客户程序提交此消息给一个DDE服务程序,客户使用此消息来请求服务器接收一个未经同意的数据项;服务器通过答复WM_DDE_ACK消息提示是否它接收这个数据项;WM_DDE_EXECUTE = WM_DDE_FIRST + 8;一个DDE客户程序提交此消息给一个DDE服务程序来发送一个字符串给服务器让它象串行命令一样被处理,服务器通过提交WM_DDE_ACK消息来作回应;WM_DDE_LAST = WM_DDE_FIRST + 8;WM_APP = $8000;WM_USER = $0400;此消息能帮助应用程序自定义私有消息;/////////////////////////////////////////////////////////////////////通知消息通知消息(Notification message)是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通知父窗口。