Hook的简单应用

    技术2022-05-17  37

    使用HOOK 截获消息与Windows消息循环相似,编写一个hook程序首先需要安装钩子接受消息,然后通过钩子截获消息。

     

    安装钩子可以使用SetWindowsHookEx函数

    HHOOK SetWindowsHookEx( int idHook, // type of hook to install HOOKPROC lpfn, // address of hook procedure HINSTANCE hMod, // handle to application instance DWORD dwThreadId // identity of thread to install hook for );

     

    钩子的类型有具体查看MSDN.

     

    lpfn 钩子过程,类似窗口过程函数

    hmod 全局钩子需要指定参数

    dwthreadid 线程钩子需要指定参数

     

    注意:不同的钩子类型用不同的钩子过程,同时线程钩子和全局钩子不能同时指定。

             全局钩子必须要“封装”在dll中

     

     

     

    下面以使用全局钩子,获取键盘消息作为示例

     

    1,在win32dll中编写如下代码

     

    #include "stdafx.h" HHOOK g_hKeyHook=NULL; HINSTANCE g_hInstanceDLL=NULL; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { //得到DLL模块的句柄 if (ul_reason_for_call==DLL_PROCESS_ATTACH) { g_hInstanceDLL=(HINSTANCE)hModule; } return TRUE; } LRESULT CALLBACK MyKeyboardProc(int code,WPARAM wParam,LPARAM lParam) { if (lParam>>31==0) { //0x20000000表示二进制表示0010 0000 0000 0000 0000 0000 0000 0000 //lParam 的第29位表示ALT 是否被按下 if (lParam&0x0000000) { if (wParam==VK_F4) { if (::MessageBox(NULL, "您按下了ALT+F4键!/n 是否确认关闭?", "提示",MB_YESNO)==IDNO) { //如果选择否,将不会将ALT+F4传递给窗口 //如果1表示不发送给窗口 return 1; } } } } return ::CallNextHookEx(g_hKeyHook,code,wParam,lParam); } //安装钩子 _declspec(dllexport) void SetHook() { g_hKeyHook=SetWindowsHookEx( WH_KEYBOARD, MyKeyboardProc, g_hInstanceDLL, 0); } //停止钩子 _declspec(dllexport) void StopHook() { UnhookWindowsHookEx(g_hKeyHook); }

     

     

    2,生成的dll文件和普通的dll文件使用是一样的大致步骤相同


    最新回复(0)