hook一般建立在dll中。在dll中完成hook安装,卸载。
hook安装:
hhook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)beep, hInstance, 0);
其中
WH_KEYBOARD是hook要监控的类型,这儿是键盘消息。
(HOOKPROC)beep是截获消息后的处理函数
hInstance是要安装钩子的程序实例,如果某个程序是给自己安装钩子可以通过DllMain得到。
0指安装全局钩子,其它的还有线程钩子。只针对某个线程进行监控
hook卸载:
UnhookWindowsHookEx(hhook);
hook处理函数:
LRESULT beep(int nCode,WPARAM wParam,LPARAM lParam)
{
MessageBeep(-1);
return CallNextHookEx(hhook,nCode,wParam,lParam); //向下传递
}
hook.h
#ifdef DLL_HOOK
#else
#define DLL_HOOK _declspec(dllimport)
#endif
DLL_HOOK BOOL dobeep();
DLL_HOOK BOOL undobeep();
hook.cpp
#i nclude "stdafx.h"
#i nclude "hook.h"
#define DLL_HOOK _declspec(dllexport)
HHOOK hhook;
HINSTANCE hInstance;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
hInstance=(HINSTANCE)hModule;
return TRUE;
}
LRESULT beep(int nCode,WPARAM wParam,LPARAM lParam)
{
MessageBeep(-1);
return CallNextHookEx(hhook,nCode,wParam,lParam);
}
BOOL dobeep()
{
hhook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)beep, hInstance, 0);
if(!hhook) return FALSE;
return TRUE;
}
BOOL undobeep()
{
return UnhookWindowsHookEx(hhook);
}
和普通的dll一样。只是多了一个安装、卸载的过程。
在一个程序中安装钩子
void CDlgTest::OnButton4()
{
// TODO: Add your control notification handler code here
if(dobeep()) AfxMessageBox("hook setup success.");
}
void CDlgTest::OnButton5()
{
// TODO: Add your control notification handler code here
if(undobeep()) AfxMessageBox("hook unsetup success.");
}
钩子安装后,按键会发出声音