WH_CBT回调函数

合集下载

Delphi-关于钩子函数HOOK(一)

Delphi-关于钩子函数HOOK(一)

Delphi-关于钩⼦函数HOOK(⼀)基本概念钩⼦(Hook),是Windows消息处理机制的⼀个平台,应⽤程序可以在上⾯设置⼦程以监视指定窗⼝的某种消息,⽽且所监视的窗⼝可以是其他进程所创建的。

当消息到达后,在⽬标窗⼝处理函数之前处理它。

钩⼦机制允许应⽤程序截获处理window消息或特定事件。

钩⼦实际上是⼀个处理消息的程序段,通过系统调⽤,把它挂⼊系统。

每当特定的消息发出,在没有到达⽬的窗⼝前,钩⼦程序就先捕获该消息,亦即钩⼦函数先得到控制权。

这时钩⼦函数即可以加⼯处理(改变)该消息,也可以不作处理⽽继续传递该消息,还可以强制结束消息的传递。

运⾏机制1、钩⼦链表和钩⼦⼦程:每⼀个Hook都有⼀个与之相关联的指针列表,称之为钩⼦链表,由系统来维护。

这个列表的指针指向指定的,应⽤程序定义的,被Hook⼦程调⽤的回调函数,也就是该钩⼦的各个处理⼦程。

当与指定的Hook类型关联的消息发⽣时,系统就把这个消息传递到Hook⼦程。

⼀些Hook⼦程可以只监视消息,或者修改消息,或者停⽌消息的前进,避免这些消息传递到下⼀个Hook⼦程或者⽬的窗⼝。

最近安装的钩⼦放在链的开始,⽽最早安装的钩⼦放在最后,也就是后加⼊的先获得控制权。

Windows 并不要求钩⼦⼦程的卸载顺序⼀定得和安装顺序相反。

每当有⼀个钩⼦被卸载,Windows 便释放其占⽤的内存,并更新整个Hook链表。

如果程序安装了钩⼦,但是在尚未卸载钩⼦之前就结束了,那么系统会⾃动为它做卸载钩⼦的操作。

钩⼦⼦程是⼀个应⽤程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。

⽤以监视系统或某⼀特定类型的事件,这些事件可以是与某⼀特定线程关联的,也可以是系统中所有线程的事件。

钩⼦⼦程必须按照以下的语法:LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);HookProc是应⽤程序定义的名字。

钩子程序

钩子程序

WH_JOURNALPLAYBACK Hook 使应用程序可以插入消息到系统消息队列。可以使用这个 Hook 回 放通 过 使 用 WH_JOURNALRECORD Hook 记录 下 来 的 连 续 的 鼠 标 和 键 盘 事 件 。 只 要 WH_JOURNALPLAYBACK Hook 已 经 安 装 , 正 常 的 鼠 标 和 键 盘 事 件 就 是 无 效 的 。 WH_JOURNALPLAYBACK Hook 是 全 局 Hook , 它 不 能 象 线 程 特 定 Hook 一 样 使 用 。 WH_JOURNALPLAYBACK Hook 返回超时值,这个值告诉系统在处理来自回放 Hook 当前消息之前 需要等待多长时间(毫秒) 。这就使 Hook 可以控制实时事件的回放。WH_JOURNALPLAYBACK 是 system-wide local hooks,它們不會被注射到任何行程位址空間。 (估计按键精灵是用这个 hook 做的) 7、WH_JOURNALRECORD Hook WH_JOURNALRECORD Hook 用来监视和记录输入事件。典型的,可以使用这个 Hook 记录连续的 鼠标和键盘事件, 然后通过使用 WH_JOURNALPLAYBACK Hook 来回放。 WH_JOURNALRECORD Hook 是全局 Hook,它不能象线程特定 Hook 一样使用。WH_JOURNALRECORD 是 system-wide local hooks,它們不會被注射到任何行程位址空間。 8、WH_KEYBOARD Hook 在应用程序中,WH_KEYBOARD Hook 用来监视 WM_KEYDOWN and WM_KEYUP 消息,这些消息通过 GetMessage or PeekMessage function 返回。可以使用这个 Hook 来监视输入到消息队列中 的键盘消息。 9、WH_KEYBOARD_LL Hook WH_KEYBOARD_LL Hook 监视输入到线程消息队列中的键盘消息。 10、WH_MOUSE Hook WH_MOUSE Hook 监视从 GetMessage 或者 PeekMessage 函数返回的鼠标消息。使用这个 Hook 监视输入到消息队列中的鼠标消息。 11、WH_MOUSE_LL Hook WH_MOUSE_LL Hook 监视输入到线程消息队列中的鼠标消息。 12、WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks 使我们可以监视菜单,滚动条,消息框,对话框 消息并且发现用户使用 ALT+TAB or ALT+ESC 组合键切换窗口。 WH_MSGFILTER Hook 只能监视 传递到菜单,滚动条,消息框的消息,以及传递到通过安装了 Hook 子程的应用程序建立的对 话 框 的 消 息 。 WH_SYSMSGFILTER Hook 监 视 所 有 应 用 程 序 消 息 。 WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks 使我们可以在模式循环期间过滤消息,这等价于在主消息循环中过 滤消息。通过调用 CallMsgFilter function 可以直接的调用 WH_MSGFILTER Hook。通过使用 这个函数,应用程序能够在模式循环期间使用相同的代码去过滤消息,如同在主消息循环里 一样。 13、WH_SHELL Hook 外壳应用程序可以使用 WH_SHELL Hook 去接收重要的通知。当外壳应用程序是激活的并且当 顶层窗口建立或者销毁时,系统调用 WH_SHELL Hook 子程。 WH_SHELL 共有5钟情況: 1. 只要有个 top-level、unowned 窗口被产生、起作用、或是被摧毁; 2. 当 Taskbar 需要重画某个按钮; 3. 当系统需要显示关于 Taskbar 的一个程序的最小化形式; 4. 当目前的键盘布局状态改变; 5. 当使用者按 Ctrl+Esc 去执行 Task Manager(或相同级别的程序) 。 按照惯例,外壳应用程序都不接收 WH_SHELL 消息。所以,在应用程序能够接收 WH_SHELL 消 息之前,应用程序必须调用 SystemParametersInfo function 注册它自己。

用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"

C#_HOOK

C#_HOOK

所以你在做程序时,不要因为调试失败而对这个函数有怀疑,编一个 Release 版本的程序,独 立运行再试一下。我使用的环境是 VS2005 + Vista。
接收消息的函数
1
private int HookCallback(int code, IntPtr wParam, ref KBDLLHOOKSTRUC
Reader 会在你截取之前获得键盘。 HookProc KeyBoardHookProcedure; //键盘 Hook 结构函数 [StructLayout(LayoutKind.Sequential)] public class KeyBoardHookStruct { public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; } #region DllImport //设置钩子 [DllImport("user32.dll")] public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int
看一下定义
1
[DllImport("user32.dll")]
2
private static extern IntPtr SetWindowsHookEx(
3
HookType code, HookProc func, IntPtr instance, int threadID);
4
5
[DllImport("user32.dll")]

回调函数的原理与实现

回调函数的原理与实现

回调函数的原理与实现回调函数是一种常见的编程概念,用于在程序执行过程中传递函数作为参数并在特定情况下被调用。

本文将详细探讨回调函数的原理与实现方法。

一、回调函数的原理回调函数的原理是基于函数指针的概念。

在C或C++中,函数指针是指向函数的指针变量,类似于其他变量的指针。

回调函数被声明为一个函数指针参数,并在程序运行时传递给其他函数。

当满足特定条件时,函数指针所指向的回调函数被调用。

回调函数的原理可以简化为以下几个步骤:1. 定义回调函数:首先需要定义一个回调函数,其参数和返回值根据业务需求确定。

2. 定义调用回调函数的函数:在需要触发回调函数的地方,定义一个函数,并将回调函数作为参数传递给该函数。

3. 触发回调函数:在调用回调函数的函数内部,根据特定条件判断,当条件满足时,通过调用回调函数指针来触发回调函数的执行。

二、回调函数的实现方法回调函数的实现方法有两种:函数指针和函数对象。

下面将分别介绍这两种方法的实现方式。

1. 函数指针实现回调函数:函数指针是回调函数最常见的实现方式。

以下是函数指针实现回调函数的步骤:(1)定义回调函数指针类型:在程序开始处,先定义一个函数指针类型,用于定义回调函数的指针变量。

(2)定义回调函数:根据业务需求,在程序中定义回调函数,参数和返回值与回调函数指针类型相同。

(3)定义调用回调函数的函数:在程序中定义一个函数,并以回调函数指针类型为参数。

(4)触发回调函数:在调用回调函数的函数内部,根据特定条件判断,当条件满足时,通过调用回调函数指针来触发回调函数的执行。

2. 函数对象实现回调函数:函数对象是一种将函数包装为对象的方式,可以通过重载函数调用运算符()来实现函数的调用。

以下是函数对象实现回调函数的步骤:(1)定义回调函数对象:在程序中定义一个类,并重载函数调用运算符()作为回调函数的执行体。

(2)定义调用回调函数的函数:在程序中定义一个函数,并以回调函数对象为参数。

vc++HOOK详细讲解

vc++HOOK详细讲解

vc++HOOK详细讲解消息钩子函数入门Windows 系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。

而钩子是Windows 系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。

钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。

这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。

可见,利用钩子可以实现许多特殊而有用的功能。

因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。

钩子的类型一.按事件分类,有如下的几种常用类型(1)键盘钩子和低级键盘钩子可以监视各种键盘消息。

(2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。

(3)外壳钩子可以监视各种Shell 事件消息。

比如启动和关闭应用程序。

(4)日志钩子可以记录从系统消息队列中取出的各种事件消息。

(5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。

此外,还有一些特定事件的钩子提供给我们使用,不一一列举。

下面描述常用的Hook 类型:1、WH_CALLWNDPROC 和WH_CALLWNDPROCRET Hooks WH_CALLWNDPROC 和WH_CALLWNDPROCRET Hooks 使你可以监视发送到窗口过程的消息。

系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook 子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPRO CRET Hook 子程。

WH_CALLWNDPROCRET Hook 传递指针到CWPRETSTRUCT 结构,再传递到Hook 子程。

CWPRETSTRUCT 结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。

2、WH_CBT Hook在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;2. 完成系统指令;3. 来自系统消息队列中的移动鼠标,键盘事件;4. 设置输入焦点事件;5. 同步系统消息队列事件。

钩子函数大全

钩子函数大全

GetMsgProc
HC_ACTION
WH_JOURNALPLAYBACK(1)
滚 回一个 鼠标键 盘的 消息队列,这个消息 队 列 是由 WH_JOURNALRECORD 钩 子创建的
JournalPlaybackProc
HC_GETNEXT HC_NOREMOVE
HC_SKIP HC_SYSMODALOFF HC_SYSMODALON
WH_JOURNALPLAYBACK 钩子之后才会触发该消息
键状态和上下文代码.更多信息,参见 WM_KEYUP 或 WM_KEYDOWN 仅 当
WH_KEYBOARD 挂钩安时有效.
一个窗口已经最小化或最大化了
指定被最小化或最大化 低 字 节 指 定 值 (SW_), 详 见
的窗口句柄
ShowWindow,高字节未定义
PeekMessage 函数, 设置
PM_REMOVE 标志)
钩子程序拷贝了当前的鼠标或键盘消息
EVENTMSG 结构体的指针
应用程序调用了 PeekMessage 函数,且调用 PeekMessage 函数之后,
消息没有从系统消息队列中被移除
钩子程序准备复制被 lParam 指向的 EVENTMSG 结构下的鼠标或键盘
LPARAM lParam; //消息的扩展信息 POINT pt; //发送鼠标消息时候的鼠标坐标
UINT paramL;//消息的扩展信息
WPARAM wParam; //消息的扩展信息 DWORD mouseData; //如果这个消息是 WM_MOUSEWHEEL 则高位为滚轮的滚动数目,低位保留.如果这个消息是 WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK,

常用的十三种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)类似扩充中断驱动程序,挂钩上可以挂接多个反调函数构成一个挂接函数链。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CBTProc Callback FunctionAn application-defined or library-defined callback function used with the SetWindowsHookEx function. The system calls this function before activating, creating, destroying, minimizing, maximizing, moving, or sizing a window; before completing a system command; before removing a mouse or keyboard event from the system message queue; before setting the keyboard focus; or before synchronizing with the system message queue. A computer-based training (CBT) application uses this hook procedure to receive useful notifications from the system.The HOOKPROC type defines a pointer to this callback function. CBTProc is a placeholder for the application-defined or library-defined function name.Syntax复制LRESULT CALLBACK CBTProc(__in int nCode,__in WPARAM wParam,__in LPARAM lParam);ParametersnCode [in]Type: intThe code that the hook procedure uses to determine how to process the message. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookExfunction without further processing and should return the value returned byCallNextHookEx. This parameter can be one of the following values.3 before sending the WM_CREATE or WM_NCCREATE message to thewindow. If the hook procedure returns a nonzero value, the systemdestroys the window; the CreateWindow function returns NULL, but theWM_DESTROY message is not sent to the window. If the hook procedurereturns zero, the window is created normally.At the time of the HCBT_CREATEWND notification, the window has beencreated, but its final size and position may not have been determined andits parent window may not have been established. It is possible to sendmessages to the newly created window, although it has not yet receivedWM_NCCREATE or WM_CREATE messages. It is also possible to changethe position in the z-order of the newly created window by modifying thehwndInsertAfter member of the CBT_CREATEWND structure.HCBT_DESTROYWND4A window is about to be destroyed.HCBT_KEYSKIPPED 7 The system has removed a keyboard message from the system message queue. Upon receiving this hook code, a CBT application must install a WH_JOURNALPLAYBACK hook procedure in response to the keyboard message.HCBT_MINMAX1A window is about to be minimized or maximized.HCBT_MOVESIZEA window is about to be moved or sized.HCBT_QS 2 The system has retrieved a WM_QUEUESYNC message from the system message queue.HCBT_SETFOCUS9A window is about to receive the keyboard focus.HCBT_SYSCOMMAND 8 A system command is about to be carried out. This allows a CBT application to prevent task switching by means of hot keys.wParam [in]Type: WPARAMDepends on the nCode parameter. For details, see the following Remarks section. lParam [in]Type: LPARAMDepends on the nCode parameter. For details, see the following Remarks section. Return ValueType: LRESULTThe value returned by the hook procedure determines whether the system allows or prevents one of these operations. For operations corresponding to the following CBT hook codes, the return value must be 0 to allow the operation, or 1 to prevent it.∙HCBT_ACTIVATE∙HCBT_CREATEWND∙HCBT_DESTROYWND∙HCBT_MINMAX∙HCBT_MOVESIZE∙HCBT_SETFOCUS∙HCBT_SYSCOMMANDFor operations corresponding to the following CBT hook codes, the return value is ignored.∙HCBT_CLICKSKIPPED∙HCBT_KEYSKIPPED∙HCBT_QSRemarksThe hook procedure should not install a WH_JOURNALPLAYBACK hook procedure except in the situations described in the preceding list of hook codes.An application installs the hook procedure by specifying the WH_CBT hook type and a pointer to the hook procedure in a call to the SetWindowsHookEx function.The following table describes the wParam and lParam parameters for each HCBT_ hook code.Value wParam lParamHCBT_ACTIVATE Specifies the handle to thewindow about to be activated. Specifies a long pointer to a CBTACTIVATESTRUCT structure containing the handle to the active window and specifies whether the activation is changing because of a mouse click.HCBT_CLICKSKIPPED Specifies the mouse messageremoved from the systemmessage queue. Specifies a long pointer to a MOUSEHOOKSTRUCT structure containing the hit-test code and the handle to the window for which the mouse message is intended.The HCBT_CLICKSKIPPED value is sent to a CBTProc hook procedure only if aWH_MOUSE hook is installed. For a list of hit-test codes, see WM_NCHITTEST.HCBT_CREATEWND Specifies the handle to the newwindow. Specifies a long pointer to aCBT_CREATEWND structure containing initialization parameters for the window. The parameters include the coordinates and dimensions of the window. By changing these parameters, a CBTProc hook procedure can set the initial size and position of the window.HCBT_DESTROYWND Specifies the handle to thewindow about to be destroyed.Is undefined and must be set to zero.HCBT_KEYSKIPPED Specifies the virtual-key code. Specifies the repeat count, scan code,key-transition code, previous key state,and context code. The HCBT_KEYSKIPPEDvalue is sent to a CBTProc hook procedure only if a WH_KEYBOARD hook is installed. For more information, see WM_KEYUP or WM_KEYDOWN.HCBT_MINMAX Specifies the handle to thewindow being minimized ormaximized. Specifies, in the low-order word, a show-window value (SW_) specifying the operation. For a list of show-window values, see the ShowWindow. The high-order word is undefined.HCBT_MOVESIZE Specifies the handle to thewindow to be moved or sized. Specifies a long pointer to a RECT structure containing the coordinates of the window. By changing the values in the structure, a CBTProc hook procedure can set the final coordinates of the window.HCBT_QS Is undefined and must be zero. Is undefined and must be zero.HCBT_SETFOCUS Specifies the handle to thewindow gaining the keyboardfocus. Specifies the handle to the window losing the keyboard focus.HCBT_SYSCOMMAND Specifies a system-commandvalue (SC_) specifying thesystem command. For moreinformation aboutsystem-command values, seeWM_SYSCOMMAND. Contains the same data as the lParam value of a WM_SYSCOMMAND message: If a system menu command is chosen with the mouse, the low-order word contains the x-coordinate of the cursor, in screen coordinates, and the high-order word contains the y-coordinate; otherwise, the parameter is not used.。

相关文档
最新文档