【发布时间】:2014-05-18 02:08:53
【问题描述】:
我试图将所有内容嵌入到单个 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。会不会是这个问题?
我试图存档的是在前台窗口更改时更新我的应用程序的配置。我知道我可以简单地启动另一个线程来关注它。但我不喜欢这样,目前程序只能被动地响应用户输入或赢得回调。
【问题讨论】: