繁体   English   中英

全局钩子是否可以在x86和x64上运行

[英]Will global hooks work across x86 and x64

我试图将所有内容嵌入到单个COM dll中。 目前我将WH_GETMESSAGE和WH_CBT挂钩如下:

BOOL TouchDetector::SetMessageHook(BOOL Install)
{
if (Install)
{
    return ((mHookMessage = ::SetWindowsHookEx(WH_GETMESSAGE, MessageHookProc, mDll, 0)) != NULL)
         && ((mHookWin = ::SetWindowsHookEx(WH_CBT, WinHookProc, mDll, 0)) != NULL);
}
else
{
    return UnhookWindowsHookEx(mHookMessage)
        && UnhookWindowsHookEx(mHookWin);
}
};

我也把这样的共享变量:

#pragma data_seg(".shared")
TouchDetector*   pTouch = nullptr;
HHOOK            mHookMessage = NULL;
HHOOK            mHookWin = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:.shared,rws")

通过附加到explorer.exe我可以看到钩子工作但不是全局的。 我也尝试了SetWinEventHook,但结果相同:只对我创建的窗口或explorer.exe做出反应。

它自己的COM dll是x64,因为explorer是x64。 这可能是问题吗?

我试图存档的是在前景窗口改变时更新我的​​应用程序的配置。 我知道我可以简单地开始另一个线程来关注它。 但我不喜欢这样,目前该程序只是被动地响应用户输入或赢得回调。

SetWindowsHookEx文档

SetWindowsHookEx可用于将DLL注入另一个进程。 32位DLL无法注入64位进程,64位DLL无法注入32位进程。 如果应用程序需要在其他进程中使用钩子,则需要32位应用程序调用SetWindowsHookEx将32位DLL注入32位进程,并且64位应用程序调用SetWindowsHookEx注入64位DLL进入64位进程。 32位和64位DLL必须具有不同的名称。

要挂钩64位Windows安装的桌面上的所有应用程序,请安装32位全局挂钩和64位全局挂钩,每个挂钩都来自适当的进程,并确保在挂钩应用程序中保留消息以避免阻塞正常运行。

全局钩子是共享资源,安装它会影响与调用线程在同一桌面中的所有应用程序。

因此,您需要创建两个版本的DLL,一个用于32位钩子,另一个用于64位钩子。 要小心,如果你决定添加一个WH_MOUSEWH_KEYBOARDWH_JOURNAL*WH_SHELL全局钩子:

请注意,可以在安装挂钩的线程上调用WH_MOUSE,WH_KEYBOARD,WH_JOURNAL *,WH_SHELL和低级挂钩,而不是处理挂钩的线程。 对于这些挂钩,如果32位挂钩位于挂钩链中的64位挂钩之前,则可能会调用32位和64位挂钩。

但是对于你的WH_GETMESSAGEWH_CBT钩子,你应该可以使用相同DLL的两个版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM