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

这几天被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);

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。 首先,WinHook 是一个用于Windows操作系统的钩子库,它允许你监视和控制系统中发生的事件。使用WinHook,你可以捕捉和处理各种系统事件,如键盘和鼠标输入,窗口消息等。 要实现在按下Home键时呼出隐藏窗口,你需要创建一个钩子函数来捕捉Home键的按下事件。以下是一个基本的WinHook钩子函数的示例代码: ``` ' 定义钩子回调函数 Declare Function HookProc Lib "user32.dll" Alias "CallNextHookEx" (ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ' 定义钩子ID常量 Const WH_KEYBOARD_LL = 13 ' 定义键盘事件常量 Const WM_KEYDOWN = &H100 Const WM_SYSKEYDOWN = &H104 ' 定义键盘事件数据结构 Type KBDLLHOOKSTRUCT vkCode As Long scanCode As Long flags As Long time As Long dwExtraInfo As Long End Type ' 声明全局变量 Dim hHook As Long ' 钩子回调函数 Function KeyboardHook(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim HookData As KBDLLHOOKSTRUCT If nCode = HC_ACTION Then If wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Then ' 捕捉Home键按下事件,显示隐藏窗口 HookData = ByVal lParam If HookData.vkCode = vbKeyHome Then ' 显示隐藏窗口的代码 ... End If End If End If ' 调用下一个钩子函数 KeyboardHook = HookProc(nCode, wParam, lParam) End Function ' 安装钩子函数 Function InstallHook() As Boolean hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf KeyboardHook, App.hInstance, 0) If hHook <> 0 Then InstallHook = True Else InstallHook = False End If End Function ' 卸载钩子函数 Function UninstallHook() As Boolean If UnhookWindowsHookEx(hHook) <> 0 Then UninstallHook = True Else UninstallHook = False End If End Function ``` 在上面的代码中,我们定义了一个名为KeyboardHook的钩子回调函数,用于捕捉按键事件。在钩子回调函数中,我们检查按键事件的vkCode是否为vbKeyHome,如果是,就执行显示隐藏窗口的代码。 要安装钩子函数,我们调用SetWindowsHookEx函数,并将WH_KEYBOARD_LL作为钩子类型传入。要卸载钩子函数,我们调用UnhookWindowsHookEx函数,传入钩子句柄hHook。 以上是使用WinHook控件实现在按下Home键时呼出隐藏窗口的基本代码示例,你可以根据自己的需要进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值