WH_CBT回调函数
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消息的钩子的源码
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
所以你在做程序时,不要因为调试失败而对这个函数有怀疑,编一个 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详细讲解消息钩子函数入门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的大部分内容: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)类似扩充中断驱动程序,挂钩上可以挂接多个反调函数构成一个挂接函数链。
钩子函数详细描述
钩子HHOOK SetWindowsHookEx( //装载一个钩子int idHook, //描述被装载的钩子的类型,参数见下面HOOKPROC lpfn, //钩子回调函数的地址,如果dwThreadId 为0 那么这个回调函数会在不同的进程中创建,它必须写在在DLL中HINSTANCE hMod, //DLL的句柄DWORD dwThreadId //描述要钩住的线程ID,如果这个参数为0,则会钩住桌面上的所有线程); //如果函数调用成功,返回值是成功开启的钩子句柄,如果失败,返回值为0/*idHook 相关的参数:WH_CALLWNDPROC :安装一个钩子,监视系统发送给窗口的消息,更多信息如下:LRESULT CALLBACK CallWndProc(int nCode, //描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息WPARAM wParam, //描述这个消息是否来自于当前的线程,如果这个消息是来自于当前的线程那么该值为非零,否则该值为零LPARAM lParam //一个指向CWPSTRUCT 结构体的指针,更多相关信息如下:);typedef struct {LPARAM lParam; //消息的扩展信息WPARAM wParam; //消息的扩展信息UINT message; //消息HWND hwnd; //接受消息的窗口} CWPSTRUCT, *PCWPSTRUCT;WH_CALLWNDPROCRET :安装一个钩子,监视系统发送已经处理后给窗口的消息,更多信息如下:LRESULT CALLBACK CallWndRetProc(int nCode, //描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息WPARAM wParam, //描述这个消息是否来自于当前的线程,如果这个消息是来自于当前的线程那么该值为非零,否则该值为零LPARAM lParam //一个指向CWPSTRUCT 结构体的指针,更多相关信息如上:);WH_CBT :安装一个钩子,临视系统发送给窗口的基本信息(基于计算机培训的"钩子"),更多信息如下: LRESULT CALLBACK CBTProc(int nCode, //描述钩子程序装如何处理消息,如果nCode 的值小于零那么钩子程序将跳过这个消息.返回调用CallNextHookEx 得到的返回值,相关值的意义如下WPARAM wParam, //相关信息参见返回值LPARAM lParam //相关信息参见返回值); //返回值为参数一相关的值// nCode 的相关值HCBT_ACTIVATE :系统正要激活一个窗口HCBT_CLICKSKIPPED :系统已经从消息队列中删除了鼠标滚回消息,必须在安装了WH_JOURNALPLAYBACK 钩子之后才会触发该消息HCBT_CREATEWND :一个窗口已经被创建,系统会在发送WM_CREATE 或WM_NCCREATE 消息之前调用钩子程序.如果钩子程序的返回值为非零,那么系统装会销毁这个窗口, CreateWindow 函数的返回值会为NULL,但是WM_DESTROY消息不会发送给窗口,如果钩子程序的返回值为零,那么窗口会被正常创建,在HCBT_CREATEWND 被通知的时候,这个窗口就已经被创建了,但是它的大小和位置被有被指定,以及它的父窗口也没有被指定.HCBT_DESTROYWND :一个窗口已经被销毁HCBT_KEYSKIPPED :系统已经从消息队列中删除了键盘滚回消息,必须在安装了WH_JOURNALPLAYBACK 钩子之后才会触发该消息HCBT_MINMAX :一个窗口已经最小化或最大化了HCBT_MOVESIZE :一个窗口已经移动了或改变了大小HCBT_QS :一个窗口已经从系统消息队列中接受了WM_QUEUESYNC 消息.HCBT_SETFOCUS :一个窗口已经被激活HCBT_SYSCOMMAND :一个窗口已经接受了系统命令WH_DEBUG :安装一个钩子,钩住安装钩子的程序(差错"钩子"),更多信息如下:LRESULT CALLBACK DebugProc(int nCode, //描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息WPARAM wParam, //描述什么样的钩子被装载了,参数值与SetWindowsHookEx 函数的idHook 参数值相同LPARAM lParam //一个指向DEBUGHOOKINFO 结构体的指什,具体信息如下:);typedef struct {DWORD idThread; //filter 线程的IDDWORD idThreadInstaller; //debugging filter 线程的IDLPARAM lParam; //描述跳过此钩子程序要传递给Debug程序的lParamWPARAM wParam; //描述跳过此钩子程序要传递给Debug程序的wParamint code; //描述跳过此钩子程序要传遵给Debug程序的nCode} DEBUGHOOKINFO, *PDEBUGHOOKINFO;WH_FOREGROUNDIDLE :安装一个钩子,当一个程序的前端线程改变为低优先级时调用钩子程序,这个钩子在一个任务被降低优先级前工作(前台空闲窗口"钩子"),更多信息如下:DWORD CALLBACK ForegroundIdleProc(int code, //描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息DWORD wParam, //这个参数没有用LONG lParam //这个参数没有用);WH_GETMESSAGE :安装一个钩子,监视一个消息被寄送到了消息等待队列中(接收消息投递的"钩子"),更多信息如下:LRESULT CALLBACK GetMsgProc(int code, //描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息WPARAM wParam, //描述这个消息是否被删除了从消息队列中值为: PM_NOREMOVE :描述这个消息没有从消息队列中删除(应用程序调用了PeekMessage )PM_REMOVE :描述这个消息已经从消息队列中删除(应用程序调用了GetMessage 或PeekMessage)LPARAM lParam //一个指向MSG 结构体的指针,,具体信息如下:);typedef struct {HWND hwnd; //接受消息的窗体句柄UINT message; //描述消息,应用程序通常使用低位WORD 值,操作系统通常使用高位WORD 值WPARAM wParam; //消息的附加消息LPARAM lParam; //消息的附加消息DWORD time; //消息的发送时间POINT pt; //消息发送时的鼠标指针位置} MSG, *PMSG;WH_JOURNALPLAYBACK :安装一个钩子,滚回一个鼠标键盘的消息队列,这个消息队列是由WH_JOURNALRECORD 钩子创建的,更多信息如下:LRESULT CALLBACK JournalPlaybackProc(int code, //描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息这个参数可能是以下值:HC_GETNEXT :钩子程序拷贝了当前的鼠标或键盘消息,它是一个EVENTMSG 结构体,由lParam 来传递指针HC_NOREMOVE :应用程序调用了PeekMessage 函数,且调用PeekMessage 函数之后,消息没有从系统消息队列中被移除 HC_SKIP :钩子程序准备复制被lParam 指向的EVENTMSG 结构下的鼠标或键盘信息,一旦收到HC_GETNEXT 钩子程序复制HC_SYSMODALOFF :一个消息框被销毁,钩子程序将继续开始滚回消息HC_SYSMODALON :一个消息框被显示出来,钩子程序将暂停滚回消息,直到这个消息框被销毁,钩子程序才继续开始滚回消息 WPARAM wParam, //无用的参数LPARAM lParam //只有当nCode 参数的值为HC_GETNEXT ,它才是一个指向EVENTMSG 结构体的指针,否则是无用的参数);WH_JOURNALRECORD :安装一个钩子,记录一个鼠标键盘消息队列,更多信息如下:LRESULT CALLBACK JournalRecordProc(int code,//描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息HC_SYSMODALOFF :一个消息框被销毁,钩子程序将继续开始滚回消息HC_SYSMODALON :一个消息框被显示出来,钩子程序将暂停滚回消息,直到这个消息框被销毁,钩子程序才继续开始滚回消息WPARAM wParam,//这个参数是无效的LPARAM lParam//一个指向EVENTMSG 结构体的指针变量);typedef struct {UINT message; //描述消息UINT paramL; //消息的扩展信息UINT paramH; //消息的扩展信息DWORD time; //寄送消息的时间HWND hwnd; //接受消息的窗口句柄} EVENTMSG, *PEVENTMSG;WH_KEYBOARD :安装一个钩子:监视键盘的消息,更多信息如下:LRESULT CALLBACK KeyboardProc(int code, //描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息这个参数可能是以下值:HC_ACTION :wParam 和lParam 包涵了完整的消息HC_NOREMOVE :wParam 和lParam 包涵了完整的消息,且这个键盘消息没有从系统消息队列中删除WPARAM wParam, //描述键盘消息的虚拟键信息LPARAM lParam //描述键盘消息的扫描码信息);WH_KEYBOARD_LL :安装一个钩子:监视键盘的低级消息(Windows NT/2000/XP),更多信息如下: LRESULT CALLBACK LowLevelKeyboardProc(int nCode, //描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息HC_ACTION :wParam 和lParam 包涵了完整的消息WPARAM wParam, //描述了键盘的消息值:WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, 或WM_SYSKEYUP.LPARAM lParam //一个指向KBDLLHOOKSTRUCT 结构体的指针变量,更多信息如下: );typedef struct {DWORD vkCode; //键盘消息的虚拟键信息,值的范围从1至254DWORD scanCode; //键盘的扫描码信息DWORD flags; //键盘的扩展信息DWORD time; //消息的产生时间,可以用 GetMessageTime 函数取得ULONG_PTR dwExtraInfo; //消息的扩展信息} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;WH_MOUSE :安装一个钩子:监视键盘的消息,更多信息如下:LRESULT CALLBACK MouseProc(int nCode, //描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息这个参数可能是以下值:HC_ACTION :wParam 和lParam 包涵了完整的消息HC_NOREMOVE :wParam 和lParam 包涵了完整的消息,且这个鼠标消息没有从系统消息队列中删除 WPARAM wParam, //描述了鼠标的消息值LPARAM lParam //一个指向MOUSEHOOKSTRUCT 结构体的指针变量,更多信息如下: );typedef struct {POINT pt; //发送鼠标消息时候的鼠标坐标HWND hwnd; //接收鼠标消息的窗口句柄UINT wHitTestCode; //测试码ULONG_PTR dwExtraInfo; //鼠标消息的扩展信息} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;WH_MOUSE_LL :安装一个钩子:监视鼠标的低级消息(Windows NT/2000/XP),更多信息如下:LRESULT CALLBACK LowLevelMouseProc(int nCode, //描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息这个参数可能是以下值: HC_ACTION :wParam 和lParam 包涵了完整的消息 WPARAM wParam, //描术了鼠标的消息值: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN, 或WM_RBUTTONUP.LPARAM lParam //一个指向MSLLHOOKSTRUCT 的指针变量,具体信息如下:);typedef struct {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; //描述消息的扩展信息} MSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;WH_MSGFILTER :安装一个钩子:监视一些如同输入框,消息框,菜单,滚动条的事件(对话框、消息框、菜单或滚动条输入消息"钩子"),更多信息如下:LRESULT CALLBACK MessageProc(int code, //描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息这个参数可能是以下值: MSGF_DDEMGR :输入框MSGF_DIALOGBOX :消息框MSGF_MENU :菜单MSGF_SCROLLBAR :滚动条WPARAM wParam, //保留值LPARAM lParam //一个指向MSG 的指针变量,更多信息参见上面;);WH_SHELL :安装一个钩子:监视对程序的Shell 操作(外壳"钩子"),更多信息如下:LRESULT CALLBACK ShellProc(int nCode, //描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息这个参数可能是以下值:HSHELL_ACCESSIBILITYSTATE :程序的访问权被改变(Windows 2000/XP)HSHELL_ACTIVATESHELLWINDOW :Shell 操作将激活程序的主窗口HSHELL_APPCOMMAND :用户完成了输入一个指令(例如按下了一个关键的按钮或键)而且应用程序没有处理被产生的WM_APPCOMMAND 消息.WM_APPCOMMAND值参见下面wParam:按下或放开按钮lParam:APPCOMMAND_BASS_BOOST :低音开关APPCOMMAND_BASS_DOWN :减少低音APPCOMMAND_BASS_UP :增加低音APPCOMMAND_BROWSER_BACKWARD :浏览器-向前APPCOMMAND_BROWSER_FAVORITES:浏览器-收藏夹APPCOMMAND_BROWSER_FORWARD :浏览器-向后APPCOMMAND_BROWSER_HOME :浏览器-主页APPCOMMAND_BROWSER_REFRESH :浏览器-刷新APPCOMMAND_BROWSER_SEARCH :浏览器-搜索APPCOMMAND_BROWSER_STOP :浏览器-停止下载APPCOMMAND_CLOSE :关闭窗口(不是程序)APPCOMMAND_COPY :复制已选择APPCOMMAND_CORRECTION_LIST :当一个不正确的字符输入时,退出APPCOMMAND_CUT :剪切已选择APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE :输入和控制状态的互相改变APPCOMMAND_FIND :打开查找对话框APPCOMMAND_FORWARD_MAIL :向前浏览邮件APPCOMMAND_HELP :打开帮助对话框APPCOMMAND_LAUNCH_APP1 :打开应用程序1APPCOMMAND_LAUNCH_APP2 :打开应用程序2APPCOMMAND_LAUNCH_MAIL :打开邮件APPCOMMAND_MEDIA_CHANNEL_DOWN :向下翻多媒体的频道(Windows XP SP1)APPCOMMAND_MEDIA_CHANNEL_UP :向上翻多媒体的频道(Windows XP SP1)APPCOMMAND_MEDIA_FASTFORWARD:回滚多媒体(Windows XP SP1)APPCOMMAND_MEDIA_NEXTTRACK :多媒体播放下一个文件APPCOMMAND_MEDIA_PAUSE :多媒体暂停APPCOMMAND_MEDIA_PLAY :多媒体播放APPCOMMAND_MEDIA_PLAY_PAUSE :多媒体暂停/播放APPCOMMAND_MEDIA_RECORD :多媒体开始记录APPCOMMAND_MEDIA_REWIND :回滚(???)APPCOMMAND_MEDIA_SELECT :进入多媒体选择状态APPCOMMAND_MEDIA_STOP :多媒体停止APPCOMMAND_MIC_ON_OFF_TOGGLE:开关麦克风APPCOMMAND_MICROPHONE_VOLUME_DOWN 麦克风音量减小APPCOMMAND_MICROPHONE_VOLUME_MUTE :关闭麦克风APPCOMMAND_MICROPHONE_VOLUME_UP :麦克风音量加大APPCOMMAND_NEW :创建一个新窗口APPCOMMAND_OPEN :打开一个窗口APPCOMMAND_PASTE :粘贴APPCOMMAND_PRINT :打印APPCOMMAND_REDO :重复最后的动作APPCOMMAND_REPLY_TO_MAIL :回复一个邮件信息APPCOMMAND_SAVE :保存当前的文档APPCOMMAND_SEND_MAIL :发送一个邮件APPCOMMAND_SPELL_CHECK :开始Spell检查APPCOMMAND_TREBLE_DOWN :减小高音APPCOMMAND_TREBLE_UP :增大高音APPCOMMAND_UNDO :恢复最后的操作APPCOMMAND_VOLUME_DOWN :增大音量APPCOMMAND_VOLUME_MUTE :关闭音APPCOMMAND_VOLUME_UP :减小音量FAPPCOMMAND_KEY :用户按下了一个键FAPPCOMMAND_MOUSE :用户按下了一个鼠标按钮FAPPCOMMAND_OEM :未经确认的事件,可能是鼠标事件或是键盘事件MK_CONTROL :Ctrl键按下了MK_LBUTTON :鼠标左键按下了MK_MBUTTON :鼠标中键按下了MK_RBUTTON :鼠标右键按下了MK_SHIFT :Shift键按下了MK_XBUTTON1 :第一个X按钮按下了MK_XBUTTON2 :第二个X按钮按下了HSHELL_GETMINRECT :一个窗口取大化或最小化时系统需要它最小化后的窗口矩形HSHELL_LANGUAGE :键盘语言改变HSHELL_REDRAW :任务栏上的该窗口项重画HSHELL_TASKMAN :用户选择了任务栏中的一项HSHELL_WINDOWACTIVATED :最前端的窗口改变了Z顺序HSHELL_WINDOWCREATED :一个最前端的窗口被创建,在调用钩子函数的时候,该窗口已经被创建HSHELL_WINDOWDESTROYED :一个最前端的窗口被销毁,在调用钩子函数的时候,该窗口已经被销毁HSHELL_WINDOWREPLACED :一个最前端的窗口被改变位置,在调用钩子函数的时候,该窗口已经被改变位置WPARAM wParam, //该参数的值随nCode 参数的值改变而赋有不同的意义nCode |值HSHELL_ACCESSIBILITYSTATE |ACCESS_FILTERKEYS, ACCESS_MOUSEKEYS,或ACCESS_STICKYKEYS.HSHELL_APPCOMMAND |在上面已列出来了HSHELL_GETMINRECT |窗口句柄HSHELL_LANGUAGE |窗口句柄HSHELL_REDRAW |窗口句柄HSHELL_WINDOWACTIVATED |窗口句柄HSHELL_WINDOWCREATED |窗口句柄HSHELL_WINDOWDESTROYED |窗口句柄HSHELL_WINDOWREPLACED |窗口句柄LPARAM lParam //该参数的值随nCode 参数的值改变而赋有不同的意义nCode |值HSHELL_APPCOMMAND |HSHELL_GETMINRECT |一个指向RECT 的结构体变量HSHELL_LANGUAGE |键盘语言的句柄HSHELL_REDRAW |TRUE:重画,FALSE:别的方式HSHELL_WINDOWACTIVATED |TRUE:全屏,FALSE:别的方式HSHELL_WINDOWREPLACED |新的窗口句柄); //返回值:如果正常调用,返回值为:0 如果nCode 值为HSHELL_APPCOMMAND 且Shell 值为WM_COMMAND 则返回值为非零WH_SYSMSGFILTER :安装一个钩子:监视一些如同输入框,消息框,菜单,滚动条的系统事件(系统消息"钩子"),更多信息如下:LRESULT CALLBACK SysMsgProc(int code, //描述钩子程序是否一定要处理这个消息如果nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果nCode 的值小于零,则一定要跳过这个消息这个参数可能是以下值: MSGF_DDEMGR :输入框MSGF_DIALOGBOX :消息框MSGF_MENU :菜单MSGF_SCROLLBAR :滚动条WPARAM wParam, //保留值LPARAM lParam //一个指向MSG 的指针变量,更多信息参见上面;);*/LRESULT CallNextHookEx( //调用下一个HookHHOOK hhk, //Hook句柄int nCode, //照Hook函数的nCode 函数输入,具体见上WPARAM wParam, //照Hook函数的wParam 函数输入,具体见上LPARAM lParam //照Hook函数的lParam 函数输入,具体见上); //BOOL UnhookWindowsHookEx( //卸载掉钩子HHOOK hhk //Hook句柄);//////////////////////////////////////////////////////////////////////////////////钩子类型每一种类型的Hook可以使应用程序能够监视不同类型的系统消息处理机制。
回调函数详解与应用
回调函数详解与应用回调函数是一种在编程中常用的技术,它允许我们将一个函数作为参数传递给另一个函数,并在需要的时候调用这个函数。
在本文中,我们将详细探讨回调函数的概念、原理以及在实际应用中的使用方法。
一、概念与原理回调函数是一种通过函数指针调用的函数。
它允许我们将一个函数作为参数传递给另一个函数,并在需要的时候调用这个函数。
回调函数的使用可以使代码更加模块化,提高代码的复用性和可维护性。
回调函数的原理是基于函数指针的概念。
在编程中,函数名可以看作是函数在内存中的地址。
通过将一个函数的地址传递给另一个函数,我们可以在需要的时候调用这个函数。
这种通过函数指针调用函数的方式就是回调函数。
二、回调函数的应用回调函数在实际应用中有广泛的用途,下面将介绍几个常见的应用场景。
1. 事件处理在事件驱动的编程模型中,回调函数常用于处理各种事件。
例如,在图形用户界面(GUI)开发中,当用户点击按钮或者输入文本时,系统会触发相应的事件,并调用注册的回调函数来处理这些事件。
2. 异步编程回调函数在异步编程中扮演着重要的角色。
在异步编程中,我们需要执行一些耗时的操作,但不希望阻塞主线程。
这时可以将耗时操作放在一个回调函数中,在操作完成后由系统调用回调函数来处理结果。
3. 数据处理回调函数在数据处理中也有广泛的应用。
例如,在排序算法中,我们可以使用回调函数来指定比较两个元素的规则。
在遍历数据集合时,我们可以使用回调函数来对每个元素进行处理。
三、回调函数的示例代码下面通过一个简单的示例代码来演示回调函数的使用。
```pythondef add(a, b):return a + bdef subtract(a, b):return a - bdef calculate(a, b, operation):result = operation(a, b)print("计算结果:", result)calculate(5, 3, add) # 调用calculate函数,并传入add函数作为回调函数calculate(5, 3, subtract) # 调用calculate函数,并传入subtract函数作为回调函数```在上面的代码中,我们定义了两个函数`add`和`subtract`,分别用于实现加法和减法运算。
钩子原理
[转]钩子原理钩子原理Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。
而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。
钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。
这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
可见,利用钩子可以实现许多特殊而有用的功能。
因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。
钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。
钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。
此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。
在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC6中有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。
在本程序中为方便起见采用了标准静态连接MFC DLL。
钩子的类型一.按事件分类,有如下的几种常用类型(1)键盘钩子和低级键盘钩子可以监视各种键盘消息。
(2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。
(3)外壳钩子可以监视各种Shell事件消息。
比如启动和关闭应用程序。
(4)日志钩子可以记录从系统消息队列中取出的各种事件消息。
(5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。
钩子函数(HOOK)完整的教程
基本概念钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。
当消息到达后,在目标窗口处理函数之前处理它。
钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。
每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。
这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
例如:在系统中安装自定义的钩子,监视系统中特定时间的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
可见,利用钩子可以实现效果特殊而有用的功能。
由此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。
理论WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。
利用它们,您可以捕捉您自己进程或其它进程发生的事件。
通过“钩挂”,您可以给WINDOWS 一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生您感兴趣的事件时,WINDOWS都将调用该函数。
一共有两种类型的钩子:局部的和远程的。
工作原理当您创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。
新的钩子将加到老的前面。
当一个事件发生时,如果您安装的是一个局部钩子,您进程中的钩子函数将被调用。
如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果您想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。
当然有两个例外:工作日志钩子和工作日志回放钩子。
这两个钩子的钩子函数必须在安装钩子的线程中。
原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。
钩子技术在计算机基础考试与练习系统中的应用
钩子技术在计算机基础考试与练习系统中的应用朱江,谢深泉Snowr1221@(湘潭大学信息工程学院,411105)[摘要]钩子技术的是Windows系统中功能十分强大的技术,利用全局钩子可以方便的进入其他程序的进程地址空间,对几乎所有的Win32消息进行拦截、监视、处理。
本文分析了使用钩子技术时的主要问题,并介绍了CBT钩子在计算机基础考试系统中的应用。
[关键词] HOOK,计算机基础考试,钩子类型,API函数,消息拦截1.引言随着计算机应用的普及,学校必须对计算机文化基础教学的内容、手段及方法等进行全方位的改革,以适应信息社会的发展要求。
计算机文化基础课程不仅是一门技术更新快、信息量大的课程,同时也是一门实践性、操作性很强的课程,主要是针对基础操作技能的教学,包括Windows系统的操作能力以及办公软件的运用能力。
在教学的过程中,理论讲授是其中的一部分,而上机操作则是更为重要的,必不可少的一部分。
我们希望有这么一个练习系统,对于学生上机操作的每个动作,系统都能及时截获并且给出反馈信息,反馈的信息包括操作是对还是错,错在何处,正确操作是什么,相关知识在何处等等。
这样,学生的上机练习效率将有很大提高。
这样的系统也很适合作为考试系统,考察学生操作能力。
比起简单的单选,多选,判断题来说,操作题更能反映出学生的实际操作能力,这样的考试更客观,更公平。
对操作的截获是一件非常困难的事情,这也是计算机基础考试与练习系统的关键问题之一。
以Windows操作题而言,已有的解决方法是制作一个Windows模拟环境,实现部分Windows的功能,在模拟环境中记录下考生操作,并根据操作给出反馈信息。
学生所有的操作都必须在模拟环境中进行。
其弊端在于,Windows操作系统功能强大,操作复杂多样,同一个操作题可以用很多种方法操作,模拟环境不可能模拟出Windows的所有功能和可能的操作方法。
因此,所做的模拟环境和真实环境相差很远,甚至会误导学生对正确操作的学习,很难达到练习和考试的要求。
SetWindowsHookEx详解
SetWindowsHookEx函数功能:该函数将一个应用程序定义的挂钩处理过程安装到挂钩链中去,您可以通过安装挂钩处理过程来对系统的某些类型事件进行监控,这些事件与某个特定的线程或系统中的所有事件相关.函数原形:HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId );参数:idHook:指示欲被安装的挂钩处理过程之类型,此参数可以是以下值之一:WH_CALLWNDPROC(4):安装一个挂钩处理过程,在系统将消息发送至目标窗口处理过程之前,对该消息进行监视,详情参见CallWndProc挂钩处理过程.WH_CALLWNDPROCRET(12) :安装一个挂钩处理过程,它对已被目标窗口处理过程处理过了的消息进行监视,详情参见 CallWndRetProc 挂钩处理过程.WH_CBT(5) :安装一个挂钩处理过程,接受对CBT应用程序有用的消息 ,详情参见 CBTProc 挂钩处理过程.WH_DEBUG(9):安装一个挂钩处理过程以便对其他挂钩处理过程进行调试, 详情参见DebugProc挂钩处理过程.WH_FOREGROUNDIDLE(11):安装一个挂钩处理过程,该挂钩处理过程当应用程序的前台线程即将进入空闲状态时被调用,它有助于在空闲时间内执行低优先级的任务.WH_GETMESSAGE(3):安装一个挂钩处理过程对寄送至消息队列的消息进行监视,详情参见GetMsgProc 挂钩处理过程.WH_JOURNALPLAYBACK(1):安装一个挂钩处理过程,对此前由WH_JOURNALRECORD 挂钩处理过程纪录的消息进行寄送.详情参见 JournalPlaybackProc挂钩处理过程.WH_JOURNALRECORD(0):安装一个挂钩处理过程,对寄送至系统消息队列的输入消息进行纪录.详情参见JournalRecordProc挂钩处理过程.WH_KEYBOARD(2):安装一个挂钩处理过程对击键消息进行监视. 详情参见KeyboardProc挂钩处理过程.WH_KEYBOARD_LL(13):此挂钩只能在Windows NT中被安装,用来对底层的键盘输入事件进行监视.详情参见LowLevelKeyboardProc挂钩处理过程.WH_MOUSE(7):安装一个挂钩处理过程,对鼠标消息进行监视. 详情参见 MouseProc挂钩处理过程.WH_MOUSE_LL(14):此挂钩只能在Windows NT中被安装,用来对底层的鼠标输入事件进行监视.详情参见LowLevelMouseProc挂钩处理过程.WH_MSGFILTER(-1):安装一个挂钩处理过程, 以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.详情参见MessageProc挂钩处理过程.WH_SHELL(10):安装一个挂钩处理过程以接受对外壳应用程序有用的通知, 详情参见ShellProc挂钩处理过程.WH_SYSMSGFILTER(6):安装一个挂钩处理过程,以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.这个挂钩处理过程对系统中所有应用程序的这类消息都进行监视.详情参见 SysMsgProc挂钩处理过程.lpfn:指向相应的挂钩处理过程.若参数dwThreadId为0或者指示了一个其他进程创建的线程之标识符,则参数lpfn必须指向一个动态链接中的挂钩处理过程.否则,参数lpfn可以指向一个与当前进程相关的代码中定义的挂钩处理过程.hMod:指示了一个动态链接的句柄,该动态连接库包含了参数lpfn 所指向的挂钩处理过程.若参数dwThreadId指示的线程由当前进程创建,并且相应的挂钩处理过程定义于当前进程相关的代码中,则参数hMod必须被设置为NULL(0).dwThreadId:指示了一个线程标识符,挂钩处理过程与线程相关.若此参数值为0,则该挂钩处理过程与所有现存的线程相关.返回值:若此函数执行成功,则返回值就是该挂钩处理过程的句柄;若此函数执行失败,则返回值为NULL(0).若想获得更多错误信息,请调用GetLasError函数.备注:若参数hMod为NULL,而参数dwThreadld为0或者指示了一个其他进程创建的线程标识符,则会产生错误.对函数CallNextHookEx进行调用以下链接下一个挂钩处理过程是可选的,但也是被推荐的否则,其他安装了此挂钩的应用程序将无法获得此挂钩通知,从而可能导致错误的行为.除非您确实希望防止其他应用程序看到此挂钩通知,您应当调用函数CallNextHookEx.在终止一个应用程序之前,必须调用函数UnhookWindowsHookEx以释放与此挂钩相关的系统资源.挂钩的作用域依赖与挂钩的类型.一些挂钩只能被设置成系统作用域,其他挂钩(如下所示)还可以被设置为某一特定线程的作用域:WH_CALLWNDPROC 线程或系统WH_CALLWNDPROCRET 线程或系统WH_CBT 线程或系统WH_DEBUG 线程或系统WH_FOREGROUNDIDLE 线程或系统WH_GETMESSAGE 线程或系统WH_JOURNALPLAYBACK 系统WH_JOURNALRECORD 系统WH_KEYBOARD 线程或系统WH_KEYBOARD_LL 线程或系统WH_MOUSE 线程或系统WH_MOUSE_LL 线程或系统WH_MSGFILTER 线程或系统WH_SHELL 线程或系统WH_SYSMSGFILTER 系统对于一个特定的挂钩类型,现成的挂钩先被调用,然后才是系统挂钩被调用.系统挂钩作为共享资源,安装一次就对所用应用程序产生影响.所有的系统挂钩函数必须在库中.系统挂钩应当被限制用于一些特殊用途的应用程序或者用来作为应用程序调试的辅助工具.不再需要挂钩的库应当将相应的挂钩处理过程删除掉.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件winuser.h,库文件:用户自定义,Unicode,在Windows NT上实现了Unicode和ANSI的版本.ShellProc函数功能:挂钩处理过程是应用程序或库中定义的回调函数,它与函数 SetWindowsHookEx搭配使用.此函数从系统接受外壳(shell)通知.类型HOOKPROC定义了指向此类回调函数的指针.ShellProc时应用程序或库中定义的相应回调的位置标志符.函数原形:LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam,LPARAM lParam );参数:nCode:指示挂钩类型,该参数可以是以下值之一:HSHELL_ACCESSIBILITYSTATE:对Windows NT5.0或以上版本有效,指示"可访问性"已被改变.HSHELL_ACTIVATESHELLWINDOW: shell应当激活其主窗口.HSHELL_GETMINRECT: Windows 95 only: 一个窗口正在被最小化或者最大化,系统需要该窗口被最小化时的矩形坐标.HSHELL_LANGUAGE : Windows 95 only: 键盘语言被改变或者一个新的键盘布局被加载. HSHELL_REDRAW:Windows 95 only: 一个窗口在任务条上的标题已被重画.HSHELL_TASKMAN: Windows 95 only: 用户已选择其任务列表.一个提供了任务的列表的shell应用程序当返回TRUE,以阻止Windows开始(执行)其任务列表.HSHELL_WINDOWACTIVATED: Windows 95 only: 激活状态已被转移给一个不同的顶层无属性主窗口.HSHELL_WINDOWCREATED:一个顶层无属性主窗口已被创建.当系统调用一个SheProc函数时,该窗口存在.HSHELL_WINDOWDESTROYED:一个顶层无属性主窗口即将销毁.当系统调用SheProc 函数时.该窗口仍然存在.若nCode的值小于0,则此挂钩处理过程必须将该消息不加处理地传送给函数CallNextHookEx 并返回其返回值.wParam:此参数的值依赖于参数nCode,其依赖关系如下所示:HSHELL_ACCESSIBILITYSTATE: 指示哪一个可以访问特征已被改变了状态,可以是以下值之一:ACCESS_FILTERKYS,ACCESS_MOUSEKEYS,ACCESS_STICKKEYS.HSHELL_GETMINRECT:被最小化或者最大化的窗口句柄.HSHELL_LANGUAGE: 窗口的句柄. HSHELL_REDRAW:被重画的窗口的句柄.HSHELL_WINDOWACTIVATED:被激活的窗口的句柄. HSHELL_WINDOWCREATED:被创建的窗口的句柄.HSHELL_WINDOWDESTROYED:被销毁的窗口的句柄.lParam:此参数的值依赖于参数nCode,其依赖关系如下所示:HSHELL_GETMINRECT:指向该RECT结构的指针.HSHELL_LANGUAGE: 键盘布局的句柄. HSHELL_REDRAW:若该窗口正在闪现,则其值为TRUE,否则为FALSE.HSHELL_WINDOWACTIVATED:若该窗口是全屏模式,则其值为TRUE,否则为FALSE.返回值:返回值应为0.备注:此挂钩处理过程通过调用函数SetWindowsHookEx ,指定WH_SHLL挂钩类型及其相应挂钩处理过程首地址来安装.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件winuser.h,库文件,用户自定义.。
超级HOOK详细用法介绍
超级HOOK详细用法介绍hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。
下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS程序中使用它。
关于HOOKS使用HOOK将会降低系统效率,因为它增加了系统处量消息的工作量。
建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。
HOOK链WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。
例如,WH_MOUSE HOOK用来监视鼠标消息。
WINDOWS为这几种HOOKS维护着各自的HOOK链。
HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。
如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。
(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)HOOK过程为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自己的HOOK函数。
该函数语法如下:public function MyHook(nCode,wParam,iParam)as long‘加入代码end function其中MyHook可以随便命名,其它不能变。
该函数必须放在模块段。
nCode指定HOOK类型。
wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。
SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。
你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。
[注释]对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消息,这时,HOOK函数中的CallNextHookEx语句将被忽略。
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.然后再返回给请求硬件消息的线程。
WH_CBT回调函数
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.。
Delphi监听键盘_目前是个残次品
Delphi监听键盘_⽬前是个残次品-------------本程序刚开始是别⼈的,⽆法实现全局钩键盘消息;修改后能钩中键盘消息,但是没有去解析,那些解析暂时不正确,本⼈没有那么多时间弄这玩意--先把代码贴上,不管了,以后有时间可以玩玩。
再次强调,本程序不是本⼈的,⽹上下载⽽来.....DLL部分------------------------------library KeyboardHook;usesSysUtils,Windows,Messages,Classes;{$R *.res}varhook: HHOOK; {钩⼦变量}LastFocusWnd:Hwnd=0;PrvChar:Char;HookKey:String;KeyList:Tstringlist;int2:Integer;constKeyMask=$80000000;{键盘钩⼦函数}function KeyboardHookProc(iCode: Integer; wParam: WPARAM; lParam:LPARAM):LRESULT;stdcall;varch:Char; //记录⼀个个按下的按键字符vKey:integer; //表⽰按下了哪个键FocusWnd:HWND; //当前活动窗⼝句柄Title:array[0..255] of char; //窗⼝句柄的标题str:array[0..12] of char; // 当8<=vkey<=46时,表⽰按下的键名,例如[退格]PEvt:^EventMsg; //EventMsg的指针iCapsLock,iNumLock,iShift:integer; //状态按键bCapsLock,bNumLock,bShift:boolean; //是否按下状态按键begin//if int2<1 then// MessageBox(0,PChar('11'),PChar('00'),MB_OK );inc(int2);if iCode<0 then //遵照SDK⽂档beginResult:=CallNextHookEx(hook,iCode,wParam,lParam);Exit;end;if (iCode = HC_ACTION) then //设备动作beginPEvt := pointer(Dword(lparam)); //将lparam的指针传递给PEvt事件消息指针FocusWnd:= GetActiveWindow; //获取活动窗体句柄//if (LastFocusWnd <> FocusWnd) thenbeginif (HookKey <> '') thenbeginKeyList.Add('键盘击打:'+HookKey);HookKey:= '';end;GetWindowText(FocusWnd,Title,256);LastFocusWnd:= FocusWnd;KeyList.add(Format('激活窗⼝:%s',[Title])+' 次数:'+inttostr(int2)+'结束'); end;KeyList.add( '::'+IntToStr( PEvt.message)+' '+char(LoByte(PEvt.paramL ))); //if (PEvt.message = WM_KEYDOWN) then //如果事件消息为键下压操作if (wParam = WM_KEYDOWN) thenbeginvkey := LoByte(PEvt.paramL ); //取得16进制数最低位那个字节的内容iShift:= GetKeyState(VK_SHIFT); //获取这三个键的状态iCapsLock:= GetKeyState(VK_CAPITAL);iNumLock:= GEtKeyState(VK_NUMLOCK);bShift:= ((iShift and KeyMask) = KeyMask); //判断它们的状态bCapsLock:=(iCapsLock = 1);bNumLock:= (iNumLock = 1);if ((vKey >= 48) and (vKey <=57)) then // 0<=char(vkey)<=9beginif (not bShift) then //如果没有按下Shift键ch:= char (vkey) //数字字符elsebegincase vkey of //否则为以下字符之⼀48:ch:= ')';49:ch:= '!';50:ch:= '@';51:ch:= '#';52:ch:= '$';53:ch:= '%';54:ch:= '^';55:ch:= '&';56:ch:= '*';57:ch:= '(';end; //end caseend; //end elseHookKey:= HookKey + ch;end; //end if ((vKey >= 48) and (vKey <=57))if ((vKey >=65) and (vKey <= 90)) then // 'A'<=char(vkey)<='Z'beginif (not bCapsLock) then //如果没有按下CapsLock键beginif (bShift) then //按下了Shift键ch:= char(vkey) //⼤写elsech:= char(vkey + 32); //⼩写endelse //按下了CapsLock键beginif (bShift) then //按下了Shift键ch:= char(vkey + 32) //⼩写elsech:= char(vkey); //⼤写end;HookKey:= HookKey + ch; //将按键添加到按键字符串end;if ((vkey >= 96) and (vkey <= 105)) then //⼩键盘的0-9if bNumLock thenHookKey:= HookKey + char(vkey - 96 + 48);ch:= 'n';if ((vkey >= 105) and (vkey <=111)) then //+-*/begincase vkey of106:ch:= '*';107:ch:= '+';109:ch:= '-';111:ch:= '/';elsech:= 'n';end;end;if ((vkey >=186) and (vkey <= 222)) then //特殊符号beginif (not bShift) then //没有按下Shift键begincase vkey of186:ch:= ';';187:ch:= '=';189:ch:= ',';190:ch:= '.';191:ch:= '/';192:ch:= '''' ;219:ch:= '[';220:ch:= '\';221:ch:= ']';222:ch:=char(27);elsech:= 'n';end; //end caseendelsebegincase vkey of186:ch:= ':';187:ch:= '+';189:ch:= '<';190:ch:= '>';191:ch:= '?';192:ch:= '~';219:ch:= '{';220:ch:= '|';221:ch:= '}';222:ch:= '"';elsech:= 'n';end; //end caseend; //end if elseend; //end if ((vkey >=186) and (vkey <= 222))if ch <> 'n' then //剔除未规定字符HookKey := HookKey + ch;if ((vkey >= 8) and (vkey <=46)) thenbeginch:= ' ';case vkey of8:str:= '[BACK]';9:str:= '[TAB]';13:str:= '[ENTER]';32:str:= '[SPACE]';35:str:= '[END]';36:str:= '[HOME]';37:str:= '[LF]';38:str:= '[UF]';39:str:= '[RF]';40:str:= '[DF]';45:str:= '[INSERT]';46:str:= '[DELETE]';elsech:= 'n';end;if (ch <> 'n') thenbeginHookKey := HookKey + str;end;end;end;end;(*if iCode<0 then //遵照SDK⽂档beginResult:=CallNextHookEx(hook,iCode,wParam,lParam);Exit;end;if (iCode = HC_ACTION) then //设备动作beginPEvt := pointer(Dword(lparam)); //将lparam的指针传递给PEvt事件消息指针FocusWnd:= GetActiveWindow; //获取活动窗体句柄if (LastFocusWnd <> FocusWnd) thenbeginif (HookKey <> '') thenbeginKeyList.Add('键盘击打:'+HookKey);HookKey:= '';end;GetWindowText(FocusWnd,Title,256);LastFocusWnd:= FocusWnd;KeyList.add(Format('激活窗⼝:%s',[Title])+' :'+inttostr(int2));end;if (PEvt.message = WM_KEYDOWN) then //如果事件消息为键下压操作beginvkey := LoByte(PEvt.paramL ); //取得16进制数最低位那个字节的内容iShift:= GetKeyState(VK_SHIFT); //获取这三个键的状态iCapsLock:= GetKeyState(VK_CAPITAL);iNumLock:= GEtKeyState(VK_NUMLOCK);bShift:= ((iShift and KeyMask) = KeyMask); //判断它们的状态bCapsLock:=(iCapsLock = 1);bNumLock:= (iNumLock = 1);end;if ((vKey >= 48) and (vKey <=57)) then // 0<=char(vkey)<=9beginif (not bShift) then //如果没有按下Shift键ch:= char (vkey) //数字字符elsebegincase vkey of //否则为以下字符之⼀48:ch:= ')';49:ch:= '!';50:ch:= '@';51:ch:= '#';52:ch:= '$';53:ch:= '%';54:ch:= '^';55:ch:= '&';56:ch:= '*';57:ch:= '(';end; //end caseend; //end elseHookKey:= HookKey + ch;end; //end if ((vKey >= 48) and (vKey <=57))if ((vKey >=65) and (vKey <= 90)) then // 'A'<=char(vkey)<='Z'beginif (not bCapsLock) then //如果没有按下CapsLock键beginif (bShift) then //按下了Shift键ch:= char(vkey) //⼤写elsech:= char(vkey + 32); //⼩写endelse //按下了CapsLock键beginif (bShift) then //按下了Shift键ch:= char(vkey + 32) //⼩写elsech:= char(vkey); //⼤写end;HookKey:= HookKey + ch; //将按键添加到按键字符串end;if ((vkey >= 96) and (vkey <= 105)) then //⼩键盘的0-9 if bNumLock thenHookKey:= HookKey + char(vkey - 96 + 48);ch:= 'n';if ((vkey >= 105) and (vkey <=111)) then //+-*/begincase vkey of106:ch:= '*';107:ch:= '+';109:ch:= '-';111:ch:= '/';elsech:= 'n';end;end;if ((vkey >=186) and (vkey <= 222)) then //特殊符号beginif (not bShift) then //没有按下Shift键begincase vkey of186:ch:= ';';187:ch:= '=';189:ch:= ',';190:ch:= '.';191:ch:= '/';192:ch:= '''' ;219:ch:= '[';220:ch:= '\';221:ch:= ']';222:ch:=char(27);elsech:= 'n';end; //end caseendelsebegincase vkey of186:ch:= ':';187:ch:= '+';189:ch:= '<';190:ch:= '>';191:ch:= '?';192:ch:= '~';219:ch:= '{';220:ch:= '|';221:ch:= '}';222:ch:= '"';elsech:= 'n';end; //end caseend; //end if elseend; //end if ((vkey >=186) and (vkey <= 222))if ch <> 'n' then //剔除未规定字符HookKey := HookKey + ch;if ((vkey >= 8) and (vkey <=46)) thenbeginch:= ' ';case vkey of8:str:= '[BACK]';9:str:= '[TAB]';13:str:= '[ENTER]';32:str:= '[SPACE]';35:str:= '[END]';36:str:= '[HOME]';37:str:= '[LF]';38:str:= '[UF]';39:str:= '[RF]';40:str:= '[DF]';45:str:= '[INSERT]';46:str:= '[DELETE]';elsech:= 'n';end;if (ch <> 'n') thenbeginHookKey := HookKey + str;end;end;// KeyList.Add('ABC');end;//end iCode= HC_ACTION*)result := CallNextHookEx(hook,iCode,wparam,lparam);end;{建⽴钩⼦}function SetHook:Boolean;stdcall;beginif (hook = 0) thenbeginKeyList:=Tstringlist.Create;//hook := SetWindowsHookEx(WH_JOURNALRECORD,KeyboardHookProc,HInstance,0); //调⽤API HOOK //hook := SetWindowsHookEx(WH_KEYBOARD,KeyboardHookProc,HInstance,0); //调⽤API HOOKhook := SetWindowsHookEx(13,KeyboardHookProc,HInstance,0); //13(WH_KEYBOARD_ll)Result:=hook<>0endelseResult:=False;end;{释放钩⼦}function DelHook:Boolean;stdcall;beginif (hook <> 0 ) thenbeginResult:=UnHookWindowsHookEx(hook); //卸载HOOKhook:=0;KeyList.Free;endelseResult:=False;end;procedure PrintHook;stdcall;varprintStr:string;txtFile:TextFile;fileName:string;beginif KeyList <> nil thenbeginprintStr:=keyList.Text;KeyList.Text:='';//将键盘输⼊内容进⾏打印fileName:='.\keyboardRecord.txt';AssignFile(txtFile,fileName);if not FileExists(fileName) thenbeginRewrite(txtFile);endelsebeginAppend(txtFile);end;Writeln(txtFile,printStr+' ⾏数:'+inttostr(keyList.count)+' 结束');Closefile(txtFile);end;end;{按DLL的要求输出函数}exportsSetHook name 'SetHook',DelHook name 'DelHook',PrintHook name 'PrintHook';//SetHook,DelHook,PrintHook;{如果不需要改名,可以直接这样exports}beginSleep(1000);end.---------------------------------------1. 设置钩⼦APIHHOOK WINAPI SetWindowsHookEx(_In_ int idHook, 设置钩⼦的类型.意思就是我要设置的钩⼦是什么钩⼦. 可以是监视窗⼝过程.可以是监视消息队列._In_ HOOKPROC lpfn, 根据钩⼦类型.设置不同的回调函数._In_ HINSTANCE hMod, 钩⼦设置的Dll实例句柄,就是DLL的句柄_In_ DWORD dwThreadId 设置钩⼦的线程ID. 如果为0 则设置为全局钩⼦.); HHOOK 返回值. 是⼀个钩⼦过程句柄.2.获取模块句柄APIHMODULE WINAPI GetModuleHandle(_In_opt_ LPCTSTR lpModuleName 获取的实例句柄的⽂件名.可以是Dll可以使exe 如果为NULL 这是当前dll/exe的实例句柄); 返回值返回实例句柄.3.取消设置钩⼦APIBOOL WINAPI UnhookWindowsHookEx(_In_ HHOOK hhk 参数⼀是 SetWindowHookEx的返回值.也就是钩⼦过程句柄.); 返回值: 返回值是BOOL类型.表⽰设置是否成功或者失败.4.继续调⽤钩⼦链中的钩⼦过程.LRESULT WINAPI CallNextHookEx(_In_opt_ HHOOK hhk, 保存的钩⼦过程,也就是SetWindowsHookEx返回值._In_ int nCode,根据SetWindowsHookEx设置的钩⼦回调⽽产⽣的不同的nCode代码. 什么意思? 意思就是如果设置的钩⼦类型是⿏标消息.那么那个nCode就是⿏标消息.如果是键盘这是键盘_In_ WPARAM wParam,同2参数⼀样.附加参数. 根据钩⼦回调类型.附加参数有不同的意义.⽐如如果是⿏标.那么这个有可能代表的就是⿏标的x位置.键盘就可能是键代码_In_ LPARAM lParam 同3参数⼀样.附加参数.);5.钩⼦回调钩⼦回调根据SetWindowsHookEx参数1来设定的.⽐如如果我们设置WH_CBT 那么我们设置的回调函数就是CBT回调. 具体查询MSDN LRESULT CALLBACK CBTProc(这个回调函数⾥⾯写我们的代码就可以了._In_ int nCode,_In_ WPARAM wParam,_In_ LPARAM lParam);-------------------------------------------------------------------------------------------------LRESULT CallNextHookEx(HHOOK hhk,//此参数将被忽略int nCode,//转接代码传递到当前挂钩过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.。