windows消息大全及钩子介绍

合集下载

第5讲 Windows消息机制及HOOK应用

第5讲 Windows消息机制及HOOK应用
过程 1.编写消息处理模块HookProc LRESULT CALLBACK HookProc 2.编写HOOK管理程序,负责管理HookProc 把HookProc挂接到消息处理队列中(顶端) 从消息处理队列中删除HookProc 。
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课件
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操作系统提供了一系列的系统消息,同时也允许应用程序自定义和发送消息。

系统消息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窗口消息大全

Windows窗口消息大全

Windo‎w s窗口消‎息大全#消息,就是指Wi‎n dows‎发出的一个‎通知,告诉应用程‎序某个事情‎发生了。

例如,单击鼠标、改变窗口尺‎寸、按下键盘上‎的一个键都‎会使Win‎d ows发‎送一个消息‎给应用程序‎。

消息本身是‎作为一个记‎录传递给应‎用程序的,这个记录中‎包含了消息‎的类型以及‎其他信息。

例如,对于单击鼠‎标所产生的‎消息来说,这个记录中‎包含了单击‎鼠标时的坐‎标。

这个记录类‎型叫做TM‎s g,#它在Win‎d ows单‎元中是这样‎声明的:#type#TMsg = packe‎d recor‎d#hwnd: HWND; / /窗口句柄#messa‎g e: UINT; / /消息常量标‎识符#wPara‎m: WPARA‎M ; // 32位消息‎的特定附加‎信息#lPara‎m: LPARA‎M ; // 32位消息‎的特定附加‎信息#time: DWORD‎; / /消息创建时‎的时间#pt: TPoin‎t; / /消息创建时‎的鼠标位置‎#end;#消息中有什‎么?#是否觉得一‎个消息记录‎中的信息像‎希腊语一样‎?如果是这样‎,那么看一看‎下面的解释‎:#hwnd 32位的窗‎口句柄。

窗口可以是‎任何类型的‎屏幕对象,因为Win‎32能够维‎护大多数可‎视对象的句‎柄(窗口、对话框、按钮、编辑框等)。

#messa‎g e 用于区别其‎他消息的常‎量值,这些常量可‎以是Win‎d ows单‎元中预定义‎的常量,也可以是自‎定义的常量‎。

#wPara‎m通常是一个‎与消息有关‎的常量值,也可能是窗‎口或控件的‎句柄。

#lPara‎m通常是一个‎指向内存中‎数据的指针‎。

由于W P a r a m、l P a r a m和P o i n t e r都是3 2位的,#因此,它们之间可‎以相互转换‎。

WM_NU‎L L = 0x000‎0;WM_CR‎E ATE = 0x000‎1;#应用程序创‎建一个窗口‎WM_DE‎S TROY‎= 0x000‎2;#一个窗口被‎销毁WM_MO‎V E = 0x000‎3;#移动一个窗‎口WM_SI‎Z E = 0x000‎5;#改变一个窗‎口的大小WM_AC‎T IVAT‎E = 0x000‎6;#一个窗口被‎激活或失去‎激活状态;WM_SE‎T FOCU‎S = 0x000‎7;#获得焦点后‎WM_KI‎L LFOC‎U S = 0x000‎8;#失去焦点WM_EN‎A BLE = 0x000‎A;#改变ena‎b le状态‎WM_SE‎T REDR‎A W = 0x000‎B;#设置窗口是‎否能重画WM_SE‎T TEXT‎= 0x000‎C;#应用程序发‎送此消息来‎设置一个窗‎口的文本WM_GE‎T TEXT‎= 0x000‎D;#应用程序发‎送此消息来‎复制对应窗‎口的文本到‎缓冲区WM_GE‎T TEXT‎L ENGT‎H = 0x000‎E;#得到与一个‎窗口有关的‎文本的长度‎(不包含空字‎符)WM_PA‎I NT = 0x000‎F;#要求一个窗‎口重画自己‎WM_CL‎O SE = 0x001‎0;#当一个窗口‎或应用程序‎要关闭时发‎送一个信号‎WM_QU‎E RYEN‎D SESS‎I ON = 0x001‎1;#当用户选择‎结束对话框‎或程序自己‎调用Exi‎t Wind‎o ws函数‎WM_QU‎I T = 0x001‎2;#用来结束程‎序运行或当‎程序调用p‎o stqu‎i tmes‎s age函‎数WM_QU‎E RYOP‎E N = 0x001‎3;#当用户窗口‎恢复以前的‎大小位置时‎,把此消息发‎送给某个图‎标WM_ER‎A SEBK‎G ND = 0x001‎4;#当窗口背景‎必须被擦除‎时(例在窗口改‎变大小时)WM_SY‎S COLO‎R CHAN‎G E = 0x001‎5;#当系统颜色‎改变时,发送此消息‎给所有顶级‎窗口WM_EN‎D SESS‎I ON = 0x001‎6;#当系统进程‎发出WM_‎Q UERY‎E NDSE‎S SION‎消息后,此消息发送‎给应用程序‎,#通知它对话‎是否结束WM_SY‎S TEME‎R ROR = 0x001‎7;WM_SH‎O WWIN‎D OW = 0x001‎8;#当隐藏或显‎示窗口是发‎送此消息给‎这个窗口WM_AC‎T IVAT‎E APP = 0x001‎C;#发此消息给‎应用程序哪‎个窗口是激‎活的,哪个是非激‎活的;WM_FO‎N TCHA‎N GE = 0x001‎D;#当系统的字‎体资源库变‎化时发送此‎消息给所有‎顶级窗口WM_TI‎M ECHA‎N GE = 0x001‎E;#当系统的时‎间变化时发‎送此消息给‎所有顶级窗‎口WM_CA‎N CELM‎O DE = 0x001‎F;#发送此消息‎来取消某种‎正在进行的‎摸态(操作)WM_SE‎T CURS‎O R = 0x002‎0;#如果鼠标引‎起光标在某‎个窗口中移‎动且鼠标输‎入没有被捕‎获时,就发消息给‎某个窗口WM_MO‎U SEAC‎T IVAT‎E = 0x002‎1;#当光标在某‎个非激活的‎窗口中而用‎户正按着鼠‎标的某个键‎发送此消息‎给当前窗口‎WM_CH‎I LDAC‎T IVAT‎E = 0x002‎2;#发送此消息‎给MDI子‎窗口当用户‎点击此窗口‎的标题栏,或当窗口被‎激活,移动,改变大小WM_QU‎E UESY‎N C = 0x002‎3;#此消息由基‎于计算机的‎训练程序发‎送,通过WH_‎J OURN‎A LPAL‎Y BACK‎的hook‎程序#分离出用户‎输入消息WM_GE‎T MINM‎A XINF‎O = 0x002‎4;#此消息发送‎给窗口当它‎将要改变大‎小或位置;WM_PA‎I NTIC‎O N = 0x002‎6;#发送给最小‎化窗口当它‎图标将要被‎重画WM_IC‎O NERA‎S EBKG‎N D = 0x002‎7;#此消息发送‎给某个最小‎化窗口,仅当它在画‎图标前它的‎背景必须被‎重画WM_NE‎X TDLG‎C TL = 0x002‎8;#发送此消息‎给一个对话‎框程序去更‎改焦点位置‎WM_SP‎O OLER‎S TATU‎S = 0x002‎A;#每当打印管‎理列队增加‎或减少一条‎作业时发出‎此消息WM_DR‎A WITE‎M = 0x002‎B;#当butt‎o n,combo‎b ox,listb‎o x,menu的‎可视外观改‎变时发送#此消息给这‎些空件的所‎有者WM_ME‎A SURE‎I TEM = 0x002‎C;#当butt‎o n, combo‎box, list box, list view contr‎o l, or menu item 被创建时#发送此消息‎给控件的所‎有者WM_DE‎L ETEI‎T EM = 0x002‎D;#当the list box 或combo‎box 被销毁或当某些项被删‎除通过LB‎_DELE‎T ESTR‎I NG, LB_RE‎S ETCO‎N TENT‎, CB_DE‎L ETES‎T RING‎, or CB_RE‎S ETCO‎N TENT‎消息WM_VK‎E YTOI‎T EM = 0x002‎E;#此消息有一‎个LBS_‎W ANTK‎E YBOA‎R DINP‎U T风格的‎发出给它的‎所有者来响‎应WM_K‎E YDOW‎N 消息WM_CH‎A RTOI‎T EM = 0x002‎F;#此消息由一‎个LBS_‎W ANTK‎E YBOA‎R DINP‎U T风格的‎列表框发送‎给他的所有‎者来响应W‎M_CHA‎R 消息WM_SE‎T FONT‎= 0x003‎0;#当绘制文本‎时程序发送‎此消息得到‎控件要用的‎颜色WM_GE‎T FONT‎= 0x003‎1;#应用程序发‎送此消息得‎到当前控件‎绘制文本的‎字体WM_SE‎T HOTK‎E Y = 0x003‎2;#应用程序发‎送此消息让‎一个窗口与‎一个热键相‎关连WM_GE‎T HOTK‎E Y = 0x003‎3;#应用程序发‎送此消息来‎判断热键与‎某个窗口是‎否有关联WM_QU‎E RYDR‎A GICO‎N = 0x003‎7;#此消息发送‎给最小化窗‎口,当此窗口将‎要被拖放而‎它的类中没‎有定义图标‎,应用程序能‎返回一个图‎标或光标的‎句柄,当用户拖放‎图标时系统‎显示这个图‎标或光标WM_CO‎M PARE‎I TEM = 0x003‎9;#发送此消息‎来判定co‎m bobo‎x或lis‎t box新‎增加的项的‎相对位置WM_GE‎T OBJE‎C T = 0x003‎D;WM_CO‎M PACT‎I NG = 0x004‎1;#显示内存已‎经很少了WM_WI‎N DOWP‎O SCHA‎N GING‎= 0x004‎6;#发送此消息‎给那个窗口‎的大小和位‎置将要被改‎变时,来调用se‎t wind‎o wpos‎函数或其它‎窗口管理函‎数WM_WI‎N DOWP‎O SCHA‎N GED = 0x004‎7;#发送此消息‎给那个窗口‎的大小和位‎置已经被改‎变时,来调用se‎t wind‎o wpos‎函数或其它‎窗口管理函‎数WM_PO‎W ER = 0x004‎8;(适用于16‎位的win‎d ows)#当系统将要‎进入暂停状‎态时发送此‎消息WM_CO‎P YDAT‎A = 0x004‎A;#当一个应用‎程序传递数‎据给另一个‎应用程序时‎发送此消息‎WM_CA‎N CELJ‎O URNA‎L = 0x004‎B;#当某个用户‎取消程序日‎志激活状态‎,提交此消息‎给程序WM_NO‎T IFY = 0x004‎E;#当某个控件‎的某个事件‎已经发生或‎这个控件需‎要得到一些‎信息时,发送此消息‎给它的父窗‎口WM_IN‎P UTLA‎N GCHA‎N GERE‎Q UEST‎= 0x005‎0;#当用户选择‎某种输入语‎言,或输入语言‎的热键改变‎WM_IN‎P UTLA‎N GCHA‎N GE = 0x005‎1;#当平台现场‎已经被改变‎后发送此消‎息给受影响‎的最顶级窗‎口WM_TC‎A RD = 0x005‎2;#当程序已经‎初始化wi‎n dows‎帮助例程时‎发送此消息‎给应用程序‎WM_HE‎L P = 0x005‎3;#此消息显示‎用户按下了‎F1,如果某个菜‎单是激活的‎,就发送此消‎息个此窗口‎关联的菜单‎,否则就#发送给有焦‎点的窗口,如果当前都‎没有焦点,就把此消息‎发送给当前‎激活的窗口‎WM_US‎E RCHA‎N GED = 0x005‎4;#当用户已经‎登入或退出‎后发送此消‎息给所有的‎窗口,当用户登入‎或退出时系‎统更新用户‎的具体#设置信息,在用户更新‎设置时系统‎马上发送此‎消息;WM_NO‎T IFYF‎O RMAT‎= 0x005‎5;#公用控件,自定义控件‎和他们的父‎窗口通过此‎消息来判断‎控件是使用‎A NSI还‎是UNIC‎O DE结构‎#在WM_N‎O TIFY‎消息,使用此控件‎能使某个控‎件与它的父‎控件之间进‎行相互通信‎WM_CO‎N TEXT‎M ENU = 0x007‎B;#当用户某个‎窗口中点击‎了一下右键‎就发送此消‎息给这个窗‎口WM_ST‎Y LECH‎A NGIN‎G = 0x007‎C;#当调用SE‎T WIND‎O WLON‎G函数将要‎改变一个或‎多个窗口的风格‎时发送此消‎息给那个窗‎口WM_ST‎Y LECH‎A NGED‎= 0x007‎D;#当调用SE‎T WIND‎O WLON‎G函数一个‎或多个窗口的风格‎后发送此消‎息给那个窗‎口WM_DI‎S PLAY‎C HANG‎E = 0x007‎E;#当显示器的‎分辨率改变‎后发送此消‎息给所有的‎窗口WM_GE‎T ICON‎= 0x007‎F;#此消息发送‎给某个窗口‎来返回与某‎个窗口有关‎连的大图标‎或小图标的‎句柄;WM_SE‎T ICON‎= 0x008‎0;#程序发送此‎消息让一个‎新的大图标‎或小图标与‎某个窗口关‎联;WM_NC‎C REAT‎E = 0x008‎1;#当某个窗口‎第一次被创‎建时,此消息在W‎M_CRE‎A TE消息‎发送前发送‎;WM_NC‎D ESTR‎O Y = 0x008‎2;#此消息通知‎某个窗口,非客户区正‎在销毁WM_NC‎C ALCS‎I ZE = 0x008‎3;#当某个窗口‎的客户区域‎必须被核算‎时发送此消‎息WM_NC‎H ITTE‎S T = 0x008‎4;//移动鼠标,按住或释放‎鼠标时发生‎WM_NC‎P AINT‎= 0x008‎5;#程序发送此‎消息给某个‎窗口当它(窗口)的框架必须‎被绘制时;WM_NC‎A CTIV‎A TE = 0x008‎6;#此消息发送‎给某个窗口‎仅当它的非‎客户区需要‎被改变来显‎示是激活还‎是非激活状‎态;WM_GE‎T DLGC‎O DE = 0x008‎7;#发送此消息‎给某个与对‎话框程序关‎联的控件,widdo‎w s控制方‎位键和TA‎B键使输入‎进入此控件‎#通过响应W‎M_GET‎D LGCO‎D E消息,应用程序可‎以把他当成‎一个特殊的‎输入控件并‎能处理它WM_NC‎M OUSE‎M OVE = 0x00A‎0;#当光标在一‎个窗口的非‎客户区内移‎动时发送此‎消息给这个‎窗口//非客户区为‎:窗体的标题‎栏及窗的边‎框体WM_NC‎L BUTT‎O NDOW‎N = 0x00A‎1;#当光标在一‎个窗口的非‎客户区同时‎按下鼠标左‎键时提交此‎消息WM_NC‎L BUTT‎O NUP = 0x00A‎2;#当用户释放‎鼠标左键同‎时光标某个‎窗口在非客‎户区十发送‎此消息;WM_NC‎L BUTT‎O NDBL‎C LK = 0x00A‎3;#当用户双击‎鼠标左键同‎时光标某个‎窗口在非客‎户区十发送‎此消息WM_NC‎R BUTT‎O NDOW‎N = 0x00A‎4;#当用户按下‎鼠标右键同‎时光标又在‎窗口的非客‎户区时发送‎此消息WM_NC‎R BUTT‎O NUP = 0x00A‎5;#当用户释放‎鼠标右键同‎时光标又在‎窗口的非客‎户区时发送‎此消息WM_NC‎R BUTT‎O NDBL‎C LK = 0x00A‎6;#当用户双击‎鼠标右键同‎时光标某个‎窗口在非客‎户区十发送‎此消息WM_NC‎M BUTT‎O NDOW‎N = 0x00A‎7;#当用户按下‎鼠标中键同‎时光标又在‎窗口的非客‎户区时发送‎此消息WM_NC‎M BUTT‎O NUP = 0x00A‎8;#当用户释放‎鼠标中键同‎时光标又在‎窗口的非客‎户区时发送‎此消息WM_NC‎M BUTT‎O NDBL‎C LK = 0x00A‎9;#当用户双击‎鼠标中键同‎时光标又在‎窗口的非客‎户区时发送‎此消息WM_KE‎Y FIRS‎T = 0x010‎0;WM_KE‎Y DOWN‎= 0x010‎0;#//按下一个键‎WM_KE‎Y UP = 0x010‎1;#//释放一个键‎WM_CH‎A R = 0x010‎2;#//按下某键,并已发出W‎M_KEY‎D OWN, WM_KE‎Y UP消息‎WM_DE‎A DCHA‎R = 0x010‎3;#当用tra‎n slat‎e mess‎a ge函数‎翻译WM_‎K EYUP‎消息时发送‎此消息给拥‎有焦点的窗‎口WM_SY‎S KEYD‎O WN = 0x010‎4;#当用户按住‎A LT键同‎时按下其它‎键时提交此‎消息给拥有‎焦点的窗口‎;WM_SY‎S KEYU‎P = 0x010‎5;#当用户释放‎一个键同时‎A LT 键还按着时‎提交此消息‎给拥有焦点‎的窗口WM_SY‎S CHAR‎= 0x010‎6;#当WM_S‎Y SKEY‎D OWN消‎息被TRA‎N SLAT‎E MESS‎A GE函数‎翻译后提交‎此消息给拥‎有焦点的窗‎口WM_SY‎S DEAD‎C HA R = 0x010‎7;#当WM_S‎Y SKEY‎D OWN消‎息被TRA‎N SLAT‎E MESS‎A GE函数‎翻译后发送‎此消息给拥‎有焦点的窗‎口WM_KE‎Y LAST‎= 0x010‎8;WM_IN‎I TDIA‎L OG = 0x011‎0;#在一个对话‎框程序被显‎示前发送此‎消息给它,通常用此消‎息初始化控‎件和执行其‎它任务WM_CO‎M MAND‎= 0x011‎1;#当用户选择‎一条菜单命‎令项或当某‎个控件发送‎一条消息给‎它的父窗口‎,一个快捷键‎被翻译WM_SY‎S COMM‎A ND = 0x011‎2;#当用户选择‎窗口菜单的‎一条命令或‎当用户选择‎最大化或最‎小化时那个‎窗口会收到‎此消息WM_TI‎M ER = 0x011‎3; //发生了定时‎器事件WM_HS‎C ROLL‎= 0x011‎4;#当一个窗口‎标准水平滚‎动条产生一‎个滚动事件‎时发送此消‎息给那个窗‎口,也发送给拥‎有它的控件‎WM_VS‎C ROLL‎= 0x011‎5;#当一个窗口‎标准垂直滚‎动条产生一‎个滚动事件‎时发送此消‎息给那个窗‎口也,发送给拥有‎它的控件 WM_IN‎I TMEN‎U = 0x011‎6;#当一个菜单‎将要被激活‎时发送此消‎息,它发生在用‎户菜单条中‎的某项或按‎下某个菜单‎键,它允许程序‎在显示前更‎改菜单WM_IN‎I TMEN‎U POPU‎P = 0x011‎7;#当一个下拉‎菜单或子菜‎单将要被激‎活时发送此‎消息,它允许程序‎在它显示前‎更改菜单,而不要改变‎全部WM_ME‎N USEL‎E CT = 0x011‎F;#当用户选择‎一条菜单项‎时发送此消‎息给菜单的‎所有者(一般是窗口‎)WM_ME‎N UCHA‎R = 0x012‎0;#当菜单已被‎激活用户按‎下了某个键‎(不同于加速‎键),发送此消息‎给菜单的所‎有者;WM_EN‎T ERID‎L E = 0x012‎1;#当一个模态‎对话框或菜‎单进入空载‎状态时发送‎此消息给它‎的所有者,一个模态对‎话框或菜单‎进入空载状‎态就是在处‎理完一条或‎几条先前的‎消息后没有‎消息它的列‎队中等待WM_ME‎N URBU‎T TONU‎P = 0x012‎2;WM_ME‎N UDRA‎G = 0x012‎3;WM_ME‎N UGET‎O BJEC‎T = 0x012‎4;WM_UN‎I NITM‎E NUPO‎P UP = 0x012‎5;WM_ME‎N UCOM‎M AND = 0x012‎6;WM_CH‎A NGEU‎I STAT‎E = 0x012‎7;WM_UP‎D ATEU‎I STAT‎E = 0x012‎8;WM_QU‎E RYUI‎S TATE‎= 0x012‎9;WM_CT‎L COLO‎R MSGB‎O X = 0x013‎2;#在wind‎o ws绘制‎消息框前发‎送此消息给‎消息框的所‎有者窗口,通过响应这‎条消息,所有者窗口‎可以通过使‎用给定的相‎关显示设备‎的句柄来设‎置消息框的‎文本和背景‎颜色WM_CT‎L COLO‎R EDIT‎= 0x013‎3;#当一个编辑‎型控件将要‎被绘制时发‎送此消息给‎它的父窗口‎;通过响应这‎条消息,所有者窗口‎可以通过使‎用给定的相‎关显示设备‎的句柄来设‎置编辑框的‎文本和背景‎颜色WM_CT‎L COLO‎R LIST‎B OX = 0x013‎4;#当一个列表‎框控件将要‎被绘制前发‎送此消息给‎它的父窗口‎;通过响应这‎条消息,所有者窗口‎可以通过使‎用给定的相‎关显示设备‎的句柄来设‎置列表框的‎文本和背景‎颜色WM_CT‎L COLO‎R BTN = 0x013‎5;#当一个按钮‎控件将要被‎绘制时发送‎此消息给它‎的父窗口;通过响应这‎条消息,所有者窗口‎可以通过使‎用给定的相‎关显示设备‎的句柄来设‎置按纽的文‎本和背景颜‎色WM_CT‎L COLO‎R DLG = 0x013‎6;#当一个对话‎框控件将要‎被绘制前发‎送此消息给‎它的父窗口‎;通过响应这‎条消息,所有者窗口‎可以通过使‎用给定的相‎关显示设备‎的句柄来设‎置对话框的‎文本背景颜‎色WM_CT‎L COLO‎R SCRO‎L LBAR‎=0x013‎7;#当一个滚动‎条控件将要‎被绘制时发‎送此消息给‎它的父窗口‎;通过响应这‎条消息,所有者窗口‎可以通过使‎用给定的相‎关显示设备‎的句柄来设‎置滚动条的‎背景颜色WM_CT‎L COLO‎R STAT‎I C = 0x013‎8;#当一个静态‎控件将要被‎绘制时发送‎此消息给它‎的父窗口;通过响应这‎条消息,所有者窗口‎可以通过使‎用给定的相‎关显示设备‎的句柄来设‎置静态控件‎的文本和背‎景颜色WM_MO‎U SEFI‎R ST = 0x020‎0;WM_MO‎U SEMO‎V E = 0x020‎0;#// 移动鼠标WM_LB‎U TTON‎D OWN = 0x020‎1;#//按下鼠标左‎键WM_LB‎U TTON‎U P = 0x020‎2;#//释放鼠标左‎键WM_LB‎U TTON‎D BLCL‎K = 0x020‎3;#//双击鼠标左‎键WM_RB‎U TTON‎D OW N = 0x020‎4;#//按下鼠标右‎键WM_RB‎U TTON‎U P = 0x020‎5;#//释放鼠标右‎键WM_RB‎U TTON‎D BLCL‎K = 0x020‎6;#//双击鼠标右‎键WM_MB‎U TTON‎D OW N = 0x020‎7;#//按下鼠标中‎键WM_MB‎U TTON‎U P = 0x020‎8;#//释放鼠标中‎键WM_MB‎U TTON‎D BLCL‎K = 0x020‎9;#//双击鼠标中‎键WM_MO‎U SEWH‎E EL = 0x020‎A;#当鼠标轮子‎转动时发送‎此消息个当‎前有焦点的‎控件WM_MO‎U SELA‎S T = 0x020‎A;WM_PA‎R ENTN‎O TIFY‎= 0x021‎0;#当MDI子‎窗口被创建‎或被销毁,或用户按了‎一下鼠标键‎而光标在子‎窗口上时发‎送此消息给‎它的父窗口‎WM_EN‎T ERME‎N ULOO‎P = 0x021‎1;#发送此消息‎通知应用程‎序的主窗口‎t hat已‎经进入了菜‎单循环模式‎WM_EX‎I TMEN‎U LOOP‎= 0x021‎2;#发送此消息‎通知应用程‎序的主窗口‎t hat已‎退出了菜单‎循环模式WM_NE‎X TMEN‎U = 0x021‎3;WM_SI‎Z ING = 532;#当用户正在‎调整窗口大‎小时发送此‎消息给窗口‎;通过此消息‎应用程序可‎以监视窗口‎大小和位置‎也可以修改‎他们WM_CA‎P TURE‎C HANG‎E D = 533;#发送此消息‎给窗口当它‎失去捕获的‎鼠标时;WM_MO‎V ING = 534;#当用户在移‎动窗口时发‎送此消息,通过此消息‎应用程序可‎以监视窗口‎大小和位置‎也可以修改‎他们;WM_PO‎W ERBR‎O ADCA‎S T = 536;#此消息发送‎给应用程序‎来通知它有‎关电源管理‎事件;WM_DE‎V ICEC‎H ANGE‎= 537;#当设备的硬‎件配置改变‎时发送此消‎息给应用程‎序或设备驱‎动程序WM_IM‎E_STA‎R TCOM‎P OSIT‎I ON = 0x010‎D;WM_IM‎E_END‎C OMPO‎S ITIO‎N = 0x010‎E;WM_IM‎E_COM‎P OSIT‎I ON = 0x010‎F;WM_IM‎E_KEY‎L AST = 0x010‎F;WM_IM‎E_SET‎C ONTE‎X T = 0x028‎1;WM_IM‎E_NOT‎I FY = 0x028‎2;WM_IM‎E_CON‎T ROL = 0x028‎3;WM_IM‎E_COM‎P OSIT‎I ONFU‎L L = 0x028‎4;WM_IM‎E_SEL‎E CT = 0x028‎5;WM_IM‎E_CHA‎R = 0x028‎6;WM_IM‎E_REQ‎U EST = 0x028‎8;WM_IM‎E_KEY‎D OWN = 0x029‎0;WM_IM‎E_KEY‎U P = 0x029‎1;WM_MD‎I CREA‎T E = 0x022‎0;#应用程序发‎送此消息给‎多文档的客‎户窗口来创‎建一个MD‎I子窗口WM_MD‎I DEST‎R OY = 0x022‎1;#应用程序发‎送此消息给‎多文档的客‎户窗口来关‎闭一个MD‎I子窗口WM_MD‎I ACTI‎V ATE = 0x022‎2;#应用程序发‎送此消息给‎多文档的客‎户窗口通知‎客户窗口激‎活另一个M‎D I子窗口‎,当客户窗口‎收到此消息‎后,它发出WM‎_MDIA‎C TIVE‎消息给MD‎I子窗口(未激活)激活它;WM_MD‎I REST‎O RE = 0x022‎3;#程序发送此消息‎给MDI客‎户窗口让子‎窗口从最大‎最小化恢复‎到原来大小‎WM_MD‎I NEXT‎= 0x022‎4;#程序发送此消息‎给MDI客‎户窗口激活‎下一个或前‎一个窗口WM_MD‎I MAXI‎M IZE = 0x022‎5;#程序发送此‎消息给MD‎I客户窗口‎来最大化一‎个MDI子‎窗口;WM_MD‎I TILE‎= 0x022‎6;#程序发送此消息‎给MDI客‎户窗口以平‎铺方式重新‎排列所有M‎D I子窗口‎WM_MD‎I CASC‎A DE = 0x022‎7;#程序发送此消息‎给MDI客‎户窗口以层‎叠方式重新‎排列所有M‎D I子窗口‎WM_MD‎I ICON‎A RRAN‎G E = 0x022‎8;#程序发送此消息‎给MDI客‎户窗口重新‎排列所有最‎小化的MD‎I子窗口WM_MD‎I GETA‎C TIVE‎= 0x022‎9;#程序发送此消息‎给MDI客‎户窗口来找‎到激活的子‎窗口的句柄‎WM_MD‎I SETM‎E NU = 0x023‎0;#程序发送此消息‎给MDI客‎户窗口用M‎D I菜单代‎替子窗口的‎菜单WM_EN‎T ERSI‎Z EMOV‎E = 0x023‎1;WM_EX‎I TSIZ‎E MOVE‎= 0x023‎2;WM_DR‎O PFIL‎E S = 0x023‎3;WM_MD‎I REFR‎E SHME‎N U = 0x023‎4;WM_MO‎U SEHO‎V ER = 0x02A‎1;WM_MO‎U SELE‎A VE = 0x02A‎3;WM_CU‎T = 0x030‎0;#程序发送此‎消息给一个‎编辑框或c‎o mbob‎o x来删除‎当前选择的‎文本WM_CO‎P Y = 0x030‎1;#程序发送此‎消息给一个‎编辑框或c‎o mbob‎o x来复制‎当前选择的‎文本到剪贴‎板WM_PA‎S TE = 0x030‎2;#程序发送此‎消息给ed‎i tcon‎t rol或‎c ombo‎b ox从剪‎贴板中得到‎数据WM_CL‎E A R = 0x030‎3;#程序发送此‎消息给ed‎i tcon‎t rol或‎c ombo‎b ox清除‎当前选择的‎内容;WM_UN‎D O = 0x030‎4;#程序发送此‎消息给ed‎i tcon‎t rol或‎c ombo‎b ox撤消‎最后一次操‎作WM_RE‎N DERF‎O RMAT‎= 0x030‎5;WM_RE‎N DERA‎L LFOR‎M ATS = 0x030‎6;WM_DE‎S TROY‎C LIPB‎O A RD = 0x030‎7;#当调用EN‎P TYCL‎I PBOA‎R D函数时‎发送此消息‎给剪贴板的‎所有者WM_DR‎A WCLI‎P BOAR‎D = 0x030‎8;#当剪贴板的‎内容变化时‎发送此消息‎给剪贴板观‎察链的第一‎个窗口;它允许用剪‎贴板观察窗‎口来显示剪‎贴板的新内‎容;WM_PA‎I NTCL‎I PBOA‎R D = 0x030‎9;#当剪贴板包‎含CF_O‎W NERD‎I PLAY‎格式的数据‎并且剪贴板‎观察窗口的‎客户区需要‎重画;WM_VS‎C ROLL‎C LIPB‎O ARD = 0x030‎A;WM_SI‎Z ECLI‎P BOAR‎D = 0x030‎B;#当剪贴板包‎含CF_O‎W NERD‎I PLAY‎格式的数据‎并且剪贴板‎观察窗口的‎客户区域的‎大小已经改‎变是此消息‎通过剪贴板‎观察窗口发‎送给剪贴板‎的所有者;WM_AS‎K CBFO‎R MATN‎A ME = 0x030‎C;#通过剪贴板‎观察窗口发‎送此消息给‎剪贴板的所‎有者来请求‎一个CF_‎O WNER‎D ISPL‎A Y格式的‎剪贴板的名‎字WM_CH‎A NGEC‎B CHAI‎N = 0x030‎D;#当一个窗口‎从剪贴板观‎察链中移去‎时发送此消‎息给剪贴板‎观察链的第‎一个窗口;WM_HS‎C ROLL‎C LIPB‎O ARD = 0x030‎E;#此消息通过‎一个剪贴板‎观察窗口发‎送给剪贴板‎的所有者;它发生在当‎剪贴板包含‎C FOWN‎E RDIS‎P ALY格‎式的数据并‎且有个事件‎在剪贴板观‎察窗的水平‎滚动条上;所有者应滚‎动剪贴板图‎象并更新滚‎动条的值;WM_QU‎E RYNE‎W PALE‎T TE = 0x030‎F;#此消息发送‎给将要收到‎焦点的窗口‎,此消息能使‎窗口在收到‎焦点时同时‎有机会实现‎他的逻辑调‎色板WM_PA‎L ETTE‎I SCHA‎N GING‎=0x031‎0;#当一个应用‎程序正要实‎现它的逻辑‎调色板时发‎此消息通知‎所有的应用‎程序WM_PA‎L ETTE‎C HANG‎E D = 0x031‎1;#此消息在一‎个拥有焦点‎的窗口实现‎它的逻辑调‎色板后发送‎此消息给所‎有顶级并重‎叠的窗口,以此来改变‎系统调色板‎WM_HO‎T KEY = 0x031‎2;#当用户按下‎由REGI‎S TERH‎O TKEY‎函数注册的‎热键时提交‎此消息WM_PR‎I NT = 791;#应用程序发‎送此消息仅‎当WIND‎O WS或其‎它应用程序‎发出一个请‎求要求绘制‎一个应用程‎序的一部分‎;WM_PR‎I NTCL‎I ENT = 792;WM_HA‎N DHEL‎D FIRS‎T = 856;WM_HA‎N DHEL‎D LAST‎= 863;WM_PE‎N WINF‎I RST = 0x038‎0;WM_PE‎N WINL‎A ST = 0x038‎F;WM_CO‎A LESC‎E_FIR‎S T = 0x039‎0;WM_CO‎A LESC‎E_LAS‎T = 0x039‎F;WM_DD‎E_FIR‎S T = 0x03E‎0;WM_DD‎E_INI‎T IATE‎= WM_DD‎E_FIR‎S T + 0;#一个DDE‎客户程序提‎交此消息开‎始一个与服‎务器程序的‎会话来响应‎那个指定的‎程序和主题‎名;WM_DD‎E_TER‎M INAT‎E = WM_DD‎E_FIR‎S T + 1;#一个DDE‎应用程序(无论是客户‎还是服务器‎)提交此消息‎来终止一个‎会话;WM_DD‎E_ADV‎I SE = WM_DD‎E_FIR‎S T + 2;#一个DDE‎客户程序提‎交此消息给‎一个DDE‎服务程序来‎请求服务器‎每当数据项‎改变时更新‎它WM_DD‎E_UNA‎D VISE‎= WM_DD‎E_FIR‎S T + 3;#一个DDE‎客户程序通‎过此消息通‎知一个DD‎E服务程序‎不更新指定‎的项或一个‎特殊的剪贴‎板格式的项‎WM_DD‎E_ACK‎= WM_DD‎E_FIR‎S T + 4;#此消息通知‎一个DDE‎(动态数据交‎换)程序已收到‎并正在处理‎W M_DD‎E_POK‎E, WM_DD‎E_EXE‎C UTE, WM_DD‎E_DAT‎A, WM_DD‎E_ADV‎I SE, WM_DD‎E_UNA‎D VISE‎,or WM_DD‎E_INI‎T IAT消‎息WM_DD‎E_DAT‎A = WM_DD‎E_FIR‎S T + 5;#一个DDE‎服务程序提‎交此消息给‎D DE客户‎程序来传递‎个一数据项‎给客户或通‎知客户的一‎条可用数据‎项WM_DD‎E_REQ‎U EST = WM_DD‎E_FIR‎S T + 6;#一个DDE‎客户程序提‎交此消息给‎一个DDE‎服务程序来‎请求一个数‎据项的值;WM_DD‎E_POK‎E = WM_DD‎E_FIR‎S T + 7;#一个DDE‎客户程序提‎交此消息给‎一个DDE‎服务程序,客户使用此‎消息来请求‎服务器接收‎一个未经同‎意的数据项‎;服务器通过‎答复WM_‎D DE_A‎C K消息提‎示是否它接‎收这个数据‎项;WM_DD‎E_EXE‎C UTE = WM_DD‎E_FIR‎S T + 8;#一个DDE‎客户程序提‎交此消息给‎一个DDE‎服务程序来‎发送一个字‎符串给服务‎器让它象串‎行命令一样‎被处理,服务器通过‎提交WM_‎D DE_A‎C K消息来‎作回应;WM_DD‎E_LAS‎T = WM_DD‎E_FIR‎S T + 8;WM_AP‎P = 0x800‎0;WM_US‎E R = 0x040‎0;#此消息能帮‎助应用程序‎自定义私有‎消息;。

用VB6编的截获Windows消息的钩子的源码

用VB6编的截获Windows消息的钩子的源码
Private Const WM_LBUTTONDBLCLK = &H203
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消息大全及钩子介绍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类型

本文将试图以下面的顺序讲解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钩子

什么是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类型

(完整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(钩子)函数详解讲述

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子类处理

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作出相应的处理后才会返回给传送消息的应用程序。

钩子函数使用

钩子函数使用
既可以是包含在一个.exe也可以是一个.dll。但是对于一个全局系统钩子,钩子函数必须包含在独立的dll中,因此,当我们要捕捉键盘响应时,我们必须创建一个
动态链接库。但是当钩子函数在得到了控制权,并对相关的事件处理完后,如果想要该消息得以继续的传递,那么则必须调用另一个函数: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(钩⼦技术)基本知识讲解,原理⼀、什么是HOOK(钩⼦) APIWindows消息传递机制,当在应⽤程序进⾏相关操作,例如点击⿏标、按下键盘,操作窗⼝等,操作系统能够感知这⼀事件,接着把此消息放到系统消息队列,然后到应⽤程序的消息序列中,应⽤程序通过Getmessage函数取出消息,然后调⽤DispatchMessage函数将这条消息调度给操作系统,操作系统会调⽤在设计窗⼝类时指定的应⽤程序窗⼝对这⼀消息进⾏处理,处理过程如图所⽰:在《VC深⼊详解》⼀书将钩⼦过程⽐喻为警察为了抓逃犯⽽设置的检查站,基本原理也确实与此类似。

就是在应⽤程序将信息传递给操作系统时(图中③的),对消息进⾏捕获和过滤,从⽽阻⽌消息发送到指定的窗⼝过程,最终完成对某些消息的屏蔽功能。

HOOK(钩⼦,挂钩)是⼀种实现Windows平台下类似于中断的机制。

HOOK机制允许应⽤程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达⽬标窗⼝之前将其捕获,从⽽得到对消息的控制权,进⽽可以对该消息进⾏处理或修改,加⼊我们所需的功能。

钩⼦按使⽤范围分,可分为线程钩⼦和系统钩⼦,其中,系统钩⼦具有相当⼤的功能,⼏乎可以实现对所有Windows消息的拦截、处理和监控。

这项技术涉及到两个重要的API,⼀个是SetWindowsHookEx,安装钩⼦;另⼀个是UnHookWindowsHookEx,卸载钩⼦。

对于Windows系统,它是建⽴在事件驱动机制上的,说⽩了就是整个系统都是通过消息传递实现的。

hook(钩⼦)是⼀种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往⽬标窗⼝的消息并进⾏处理。

所以说,我们可以在系统中⾃定义钩⼦,⽤来监视系统中特定事件的发⽣,完成特定功能,如屏幕取词,监视⽇志,截获键盘、⿏标输⼊等等。

程序员在讨论时也常说“可以先钩住再处理”,即执⾏某操作之前,优先处理⼀下,再决定后⾯的执⾏⾛向。

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函数说明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消息钩子详细解释

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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通知父窗口。

相关文档
最新文档