hook编程

来源:互联网 发布:淘宝店铺转让在哪里 编辑:程序博客网 时间:2024/05/19 00:55
 一个标准的windows sdk程序的消息处理过程是:操作系统捕获某一窗口的消息,然后将该消息放到对应窗口的消息队列中,应用程序利用GetMessage从消息队列中取出消息,然后DespatchMessage将该消息传回给操作系统,最后操作系统调用该窗口的窗口过程来处理该消息。

所谓钩子(hook)就是当想屏蔽掉某些消息的时候,利用hook函数拦截该消息。
The SetWindowsHookEx function installs an application-defined hook procedure into a hook chain. You would install a hook procedure to monitor the system for certain types of events. These events are associated either with a specific thread or with all threads in the same desktop as the calling thread.

HHOOK SetWindowsHookEx(
  int idHook,        // hook type
  HOOKPROC lpfn,     // hook procedure
  HINSTANCE hMod,    // handle to application instance
  DWORD dwThreadId   // thread identifier
);

lpfn
[in] Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process.

注意对于钩子函数:If the hook procedure processed the message, it may return a nonzero value to prevent the system from passing the message to the target window procedure. 所以可以通过return 1;来屏蔽某个消息。通过返回CallNextHookEx函数调用来将某个消息交给钩子链中的下一个钩子函数处理。

dwThreadId
[in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread.

1、进程内钩子
    g_hhook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, GetCurrentThreadId());

    if (VK_SPACE == wParam)
    {
        return 1;  //成功屏蔽空格消息
    }
    else
    {
        return CallNextHookEx(g_hhook, code, wParam, lParam);  //将其他消息交给钩子链的下一个钩子过程处理
    }
这里注意钩子函数KeyboardProc的lParam参数有4个字节32位,每一个位(bit)都有着特定的意义,例如 29(bit) Specifies the context code. The value is 1 if the ALT key is down; otherwise, it is 0.
    if (VK_F4 == wParam && 1==((lParam>>29) & 1))  //判断键盘是否是按下Alt+F4。

UnhookWindowsHookEx移除钩子过程

2、全局钩子(dwThreadId为0或者dwThreadId是不同进程的线程标识符时,此时hook过程必须在dll中)
//Hook.cpp
#include <windows.h>

HHOOK g_hMouse;

LRESULT CALLBACK MouseProc(
                           int nCode,      // hook code
                           WPARAM wParam,  // message identifier
                           LPARAM lParam   // mouse coordinates
)
{
    return 1;
}

void SetHook()
{
    g_hMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, GetModuleHandle("Hook.dll"),0);
}


//Hook.def
LIBRARY Hook
EXPORTS
SetHook        @2

然后就可以在程序中链接Hook.dll,引入_declspec(dllimport) void SetHook();后,调用SetHook();启动全局钩子。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被公安怀疑贩毒怎么办 报案后证据不足怎么办 担心丈夫复嫖怎么办 交通事故当事人重伤笔录怎么办 交通事故做完笔录后怎么办 罚款单子丢了怎么办 刑事案件人跑了怎么办 打架当事人跑了怎么办 赌博被派出所抓怎么办 治安案件人跑了怎么办 去警察局做笔录怎么办 未成年打架留下案底怎么办 土地被别人侵占怎么办 在公安局有案底怎么办 做小姐有案底怎么办 党员被黑社会打怎么办 周期内被扣15分怎么办 驾证扣了50分怎么办? 酒驾拘留工作怎么办 开电动车被拘留怎么办 有一次吸毒案底怎么办 家里收到拘留书怎么办 吸毒有案底结婚怎么办 坐牢了房子按揭怎么办 被刑事拘留15天怎么办 看守所没人交生活费怎么办 判刑后看守所拒收怎么办 上海小孩怎么办图书证 渝北区回兴怎么办户口 赌博罪进看守所怎么办 无法盘腿坐疼怎么办 在看守所不会盘腿怎么办 广州入户信息卡怎么办 工商局被投诉了怎么办 公安到预审阶段怎么办 找的律师不行怎么办 犯了刑事案件该怎么办 在派出所被打怎么办 判刑了身上手机怎么办 12123登不上去怎么办 楼下幼儿园太吵怎么办