win7下不能收到窗口hook消息的问题

本文介绍在Windows 7环境下实现全局钩子时遇到的问题及解决方案。由于UIPI限制,高权限进程无法接收到来自低权限进程的消息。解决方法是在调用SetWindowsHookEx前使用ChangeWindowMessageFilterEx来修改消息过滤设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天被win7下的全局钩子困惑了很久,一直以为Win7下的全局钩子没什么变化,一直以为是自己的代码写错了....今天还在抓狂的时候被同事一语惊醒梦中人,原来TMD微软把Win7的全局hook和以前不一样了!!在网上查了一圈,果然是这样,哎~~又犯惯性思维的老毛病了,先把记下来吧,明天再验证一下。。。

感谢一下原贴作者!

win7下由于UIPI的限制, 高权限进程无法收到底权限进程发来的消息, 因此对窗口消息hook时无法接收到消息,解决办法是在调用SetWindowsHookEx之前先调用ChangeWindowMessageFilterEx,该函数修改指定窗口的UIPI消息过滤设置。原型如下:
 
BOOL WINAPI ChangeWindowMessageFilterEx(HWND hWnd,UINT message, DWORD action, PCHANGEFILTERSTRUCT pChangeFilterStruct);第一个参数要改变设置的窗口句构, 第二个参数要过滤的消息, 第三个参数要执行的动作, 第四个参数指向一个CHANGEFILTERESTRUCT结构。该结构用于返回修改结果。 另外ChangeWindowMessageFilterEx在需要从user32中导出

如下:

BOOL CallChangeWindowMessageFilter(HWND hWnd, UINT nMsg, DWORD dwAction, PCHANGEFILTERSTRUCT chfit)
{
    typedef BOOL (WINAPI *LPFUNC)(HWND, UINT, DWORD, PCHANGEFILTERSTRUCT);
    HMODULE hLib = LoadLibraryA("user32.dll");
    if (hLib)
    {
        LPFUNC func = (LPFUNC)GetProcAddress(hLib, "ChangeWindowMessageFilterEx");
        if (func && chfit)
       return func(hWnd, nMsg, dwAction, chfit);
    }
    return FALSE;

}

如果要设置一个窗口消息构子可以这样调:

CHANGEFILTERSTRUCT chfit = { sizeof(CHANGEFILTERSTRUCT) };
ChangeWindowMessageFilter(hWnd, WM_COPYDATA, MSGFLT_ALLOW, &chfit);

g_hhookCBTMsg = SetWindowsHookExW(WH_CBT ,CBTProc, hDLL, 0);

这样你的进程就可以获取来自底权限进程的消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值