C++ 全局钩子是否可以跨x86和x64工作

C++ 全局钩子是否可以跨x86和x64工作,c++,winapi,hook,C++,Winapi,Hook,我试图将所有内容嵌入到一个COM dll中。目前,我连接了WH_GETMESSAGE和WH_CBT,如下所示: BOOL TouchDetector::SetMessageHook(BOOL Install) { if (Install) { return ((mHookMessage = ::SetWindowsHookEx(WH_GETMESSAGE, MessageHookProc, mDll, 0)) != NULL) && ((mHookWin

我试图将所有内容嵌入到一个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,因为资源管理器是x64。这可能是问题所在吗

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

来自:

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\u鼠标
WH\u键盘
WH\u日志*
WH\u外壳
全局挂钩,请小心:

请注意,可以在安装挂钩的线程上调用WH_鼠标、WH_键盘、WH_日志*、WH_外壳和低级挂钩,而不是在处理挂钩的线程上调用。对于这些钩子,如果钩子链中的32位钩子在64位钩子之前,则可能同时调用32位钩子和64位钩子

但是对于
WH\u GETMESSAGE
WH\u CBT
钩子,可以使用相同DLL的两个版本