这种类型是Windows消息处理机制部分通过设置“钩子”应用可以在系统级对所有消息、事件进行过滤访问在正常情况下无法访问消息当然这么做也是需要付出定代价由于多了这么道处理过程系统性能会受到定影响所以大家在必要时候才使用“钩子”并在使用完毕及时将其删除www.
首先让我们看看HOOK是如何安装、和删除应用通常是SetWindowsHookEx来进行安装其原型如下:
SetWindowsHookEx(
Int idHook;
HOOKPROC lpfn;
HINSTANCE hMod;
DWORD dwThreadId;
);
参数介绍说明:
idHook 是”钩子”类型”钩子”类型共有13种具体如下表:
“钩子”类型
解释
WH_CALLWNDPROC
系统将消息发送到指定窗口的前“钩子”
WH_CALLWNDPROCRET
消息已经在窗口中处理“钩子”
WH_CBT
基于计算机培训“钩子”
WH_DEBUG
差错“钩子”
WH_FOREGROUNDIDLE
前台空闲窗口“钩子”
WH_GETMESSAGE
接收消息投递“钩子”
WH_JOURNALPLAYBACK
回放以前通过WH_JOURNALRECORD“钩子”记录输入消息
WH_JOURNALRECORD
输入消息记录“钩子”
WH_KEYBOARD
键盘消息“钩子”
WH_MOUSE
鼠标消息“钩子”
WH_MSGFILTER
对话框、消息框、菜单或滚动条输入消息“钩子”
WH_SHELL
外壳“钩子”
WH_SYSMSGFILTER
系统消息“钩子”
lpfn 指向“钩子”过程指针
hMod “钩子”过程所在模块句柄
dwThreadId “钩子”相关线程标识
通常我们都是把”钩子”做成动态链接库这样好处是可以是系统内每个进程访问但是也可以在系统中直接我建议还是用动态库如果用动态库话那么SetWindowsHookEx中第 3个参数就是该动态链接库模块句柄;对于个只供单个进程访问”钩子”可以将其”钩子”过程放在安装”钩子”同个线程内此时SetWindowsHookEx中第 3个参数为该线程hInstance安装”钩子”有两种思路方法:1.你可以把他做成动态连接库文件和起编译2.你可以在任何地方直接第2种思路方法太麻烦我不建议用在这里我就不详细介绍啦相比的下第1种比较简单其”钩子”过程都在动态链接库内完成SetWindowsHookEx是个安装如故个由某种类型”钩子”监视事件发生系统就会相应类型”钩子”链开始处”钩子”过程”钩子”链每个”钩子”过程都要考虑是否把事件传递给下个”钩子”过程如果要传递话就要CallNestHookEx这个成功时返回”钩子”链中下个”钩子”过程返回值返回值类型依赖于”钩子”类型这个原型如下:
LRESULT CallNextHookEx(
HHOOK hhk;
nCode;
WPARAM wParam;
LPARAM lParam;
);
其中hhk为当前”钩子”句柄由SetWindowsHookEx返回NCode为传给”钩子”过程事件代码wParam和lParam 分别是传给”钩子”过程wParam值其具体含义和”钩子”类型有关
释放”钩子”[Page]
释放”钩子”比较简单他只有个参数当不在需要”钩子”时应及时将其释放他是UnhookWindowsHookEx来实现原型如下:
UnhookWindowsHookEx(
HHOOK hhk;
);
成功返回TRUE否则返回FALSE
如果我这样讲您还是不明白话请看下面给出些典型“钩子”代码和介绍说明
LRESULT WINAPI CallWndProc( nCode,WPARAM wParam,LPARAM lParam)
{
(nCode<0)
CallNextHookEx(NULL,nCode,wParam,lParam);
switch(nCode)
{
HC_ACTION:
//”钩子”要处理什么代码
;
default:
;
}
CallNextHookEx(NULL,nCode,wParam,lParam);
}
这是WH_CALLWNDPROC”钩子”代码此”钩子”允许监视由SendMessage发送给窗口过程消息系统将消息发送到目窗口的前WH_CALLWNDPROC “钩子”过程
LRESULT WINAPI CallwndProc( nCode,WPARAM,wParam,LPARAM lParam)
{
(nCode<0) callNextHookEx(NULL,nCode,wParam,lParam);
switch(nCode)
{
HC_ACTION:
switch(wParam)
{
Case PM_REMOVE:
//某个应用了GetMessage或者是带PM_REMOVE参数//PeekMessage从消息队列中移去个消息
Break;
Case PM_NOREMOVE:
//某个应用以PM_NOREMOVE为参数PeekMessage
;
default:
;
}
;
default:
;
}
CallNextHookEx(NULL,nCode,wParam,lParam);
}
这是WH_GETMESSAGE此允许应用监视GetMessage和 PeekMessage返回消息应用可以用钩子WH_GETMESSAGE来监视鼠标和键盘输入以及其他系统发送到消息队列中消息
LRESULT CALLBACK CBTProc( nCode,WPARAM wParam,LPARAM lParam)
{
If(nCode<0) Return callNextHookEx(NULL,nCode,wParam,lParam);
Switch(nCode)
{
HCBT_ACTIVATE:
//系统将激活个窗口
;
HCBT_CLICKSKIPPED:
//系统从系统消息队列中移去个鼠标消息
;
HCBT_CREATEWND:
//系统将创建个窗口
;
HCBT_DESTROYWND:
//系统将关闭个窗口
;
HCBT_KEYSKIPPED:
//系统从系统消息队列中移去个键盘消息
;
HCBT_MINMAX:
//系统将最大化或最小化个窗口
;
HCBT_MOVESIZE:
//系统将移动个窗口或改变个窗口大小
;
HCBT_QS:
//系统在系统消息队列中检索到WM_QUEUESYNC消息
;
HCBT_SETFOCUS:
//系统设置键盘输入窗口
;
HCBT_SYSCOMMAND:
//将要执行个系统命令
;
default:
//可以添加其他代码
;
}
CallNextHookEx(NULL,nCode,wParam,lParam);
}
每种”钩子”类型都有其对应这些参数都是样有兴趣朋友可以在MSDN中找他们详细介绍说明
下面我给出个完整”钩子”安装和删除过程代码
# \"stdafx.h\"
# \"hook.h\"
HINSTANCE hInstance;[Page]
HHOOK hhkKeyboard;
BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
DLL_PROCESS_ATTACH:
DLL_THREAD_ATTACH:
DLL_THREAD_DETACH:
DLL_PROCESS_DETACH:
;
}
hInstance=(HINSTANCE)hModule;
TRUE;
}
LRESULT KeyboardProc( nCode,WPARAM wParam,LPARAM lParam)
{
MessageBeep(-1);
CallNextHookEx(NULL,nCode,wParam,lParam);
}
HOOK_API BOOL EnableKeyboardCapture
{
(!(hhkKeyboard=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hInstance,0)))
FALSE;
TRUE;
}
HOOK_API BOOL DisableKeyboardCapture
{
UnhookWindowsHookEx(hhkKeyboard);
}
注意:这是个动态链接库文件
在中要想“钩子”时候有EnableKeyboardCapture就可以啦但你按键时候就回发出声音
最新评论