什么是HOOk
HOOk是一种中断技术,可以改变拦截Windows下的消息,HOOK程序就可以在消息到达目标窗口之前将其捕获,从而得到对消息的控制权,进而可以对该消息进行处理或修改,加入我们所需的功能
API
SetWindowsHookEx设置钩子
UnHookWindowHookEx卸载钩子
注意:
先钩的后调用
32位的钩子只能钩32位的程序
键盘、鼠标信息不管什么都会都会钩住,但是不同位数的会发给hook的程序处理
钩全局使用时才会注入dll
hook分类
线程钩子监视指定线程的事件消息。
系统钩子监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL)中。这是系统钩子和线程钩子很大的不同之处。
例子
本进程hook鼠标信息
HHOOK g_hCurHook ; LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ) { if (nCode < 0) return CallNextHookEx(g_hCurHook, nCode, wParam, lParam); if(wParam==WM_MOUSEMOVE) { PMOUSEHOOKSTRUCT pMhs = (PMOUSEHOOKSTRUCT)lParam; qDebug() << "WM_MOUSEMOVE x = " << pMhs->pt.x << "y =" << pMhs->pt.y ; } return CallNextHookEx(g_hCurHook, nCode, wParam, lParam); } void QtGuiApplication1::slot1_loadHook() { g_hCurHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, NULL, GetCurrentThreadId()); } void QtGuiApplication1::slot1_UnHook() { UnhookWindowsHookEx(g_hCurHook); }
Hook全局
全局钩子又称为系统钩子,在windows下所有进程都有效
一般来说实现全局要在dll中实现(将线程号改为0)
hook全局WM_COMMAND命令 dll代码
HHOOK g_hook; LRESULT OldWindowProc; HMODULE g_hondle; LRESULT CALLBACK CallWndProc( int nCode, // hook code WPARAM wParam, // current-process flag LPARAM lParam // message data ) { if (nCode<0) { return CallNextHookEx(g_hook,nCode,wParam,lParam); } PCWPSTRUCT cs = (PCWPSTRUCT)lParam; if (cs->message == WM_COMMAND) { OutputDebugStringA("WM_COMMANDhook"); } return CallNextHookEx(g_hook, nCode, wParam, lParam); } extern "C" __declspec(dllexport) void MySetHook() { g_hook = SetWindowsHookEx( WH_CALLWNDPROC, CallWndProc, g_hondle, 0); } extern "C" __declspec(dllexport) void MyUnHook() { UnhookWindowsHookEx(g_hook); } BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { g_hondle = hModule; } case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
使用dll的cpp文件
#pragma comment(lib,"hookdll.lib") extern "C" {_declspec(dllimport) void MySetHook(); } extern "C" {_declspec(dllimport) void MyUnHook(); }
转载请说明出处
草堂教程网 » Windows中断技术之HOOK钩子编程
草堂教程网 » Windows中断技术之HOOK钩子编程