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 线程的ID
DWORD idThreadInstaller; //debugging filter 线程的ID
LPARAM lParam; //描述跳过此钩子程序要传递给Debug程序的 lParam
WPARAM wParam; //描述跳过此钩子程序要传递给Debug程序的 wParam
int 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至254
DWORD 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 :打开应用程序1
APPCOMMAND_LAUNCH_APP2 :打开应用程序2
APPCOMMAND_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( //调用下一个Hook
HHOOK hhk, //Hook句柄
int nCode, //照Hook函数的 nCode 函数输入,具体见上
WPARAM wParam, //照Hook函数的 wParam 函数输入,具体见上
LPARAM lParam //照Hook函数的 lParam 函数输入,具体见上
); //
BOOL UnhookWindowsHookEx( //卸载掉钩子
HHOOK hhk //Hook句柄
);
//////////////////////////////////////////////////////////////////////////////////
钩子类型 每一种类型的Hook可以使应用程序能够监视不同类型的系统消息处理机制。下面描述所有可以利用的Hook类型。
1、WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks
WH_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. 同步系统消息队列事件。
Hook子程的返回值确定系统是否允许或者防止这些操作中的一个。
3、WH_DEBUG Hook
在系统调用系统中与其他Hook关联的Hook子程之前,系统会调用WH_DEBUG Hook子程。你可以使用这个Hook来决定是否允许系统调用与其他Hook关联的Hook子程。
4、WH_FOREGROUNDIDLE Hook
当应用程序的前台线程处于空闲状态时,可以使用WH_FOREGROUNDIDLE Hook执行低优先级的任务。当应用程序的前台线程大概要变成空闲状态时,系统就会调用WH_FOREGROUNDIDLE Hook子程。
5、WH_GETMESSAGE Hook
应用程序使用WH_GETMESSAGE Hook来监视从GetMessage or PeekMessage函数返回的消息。你可以使用WH_GETMESSAGE Hook去监视鼠标和键盘输入,以及其他发送到消息队列中的消息。
6、WH_JOURNALPLAYBACK Hook
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,它??不??射到任何行程位址空駣??
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钟情?r:
1. 只要有个top-level、unowned 窗口被产生、起作用、或是被摧毁;
2. 当Taskbar需要重画某个按钮;
3. 当系统需要显示关于Taskbar的一个程序的最小化形式;
4. 当目前的键盘布局状态改变;
5. 当使用者按Ctrl+Esc去执行Task Manager(或相同级别的程序)。
按照惯例,外壳应用程序都不接收WH_SHELL消息。所以,在应用程序能够接收WH_SHELL消息之前,应用程序必须调用SystemParametersInfo function注册它自己。