SetWindowsHookex Global 不是很全球化
Posted
技术标签:
【中文标题】SetWindowsHookex Global 不是很全球化【英文标题】:SetWindowsHook Global not very Global 【发布时间】:2012-01-19 12:17:36 【问题描述】:我正在玩 SetWindowsHookEx,特别是我希望能够通过鼠标或键盘找出已激活的任何窗口(在我的桌面上)。
通读 SetWindowsHookEx 的 MSDN 文档,似乎 WH_CBT 类型可以完成这项工作。我创建了一个 dll 并将所有代码放在那里,我通过一个 gui 应用程序控制它(它也处理 unhook)。
但我似乎只在激活我的 gui 应用程序时获得激活码,但我激活的任何其他应用程序都会被忽略。
在我的 dll 中,我有设置代码和 CBTProc,如下所示:
LRESULT WINAPI CBTProc(int Code, WPARAM W, LPARAM L)
if(Code<0) CallN....
if (Code == HCBT_ACTIVATE) // never get unless I activate my app
HWND a = reinterpret_cast<HWND>(W);
TRACE("this window was activated %d\n", a);
CallNext....
EXPORTED HHOOK WINAPI Setup(HWND MyWind)
...
// gDllUInstance set in dllmain
return SetWindowsHookEx(WH_CBT, CBTProc, gDllUInstance, 0);
所有非常简单的东西,我已经尝试将设置移出 dll,但我仍然得到相同的效果。
看起来 dll 正在加载到其他进程中,我正在计算我得到的 DLL_PROCESS_ATTACH 的数量,并且可以看到它在上升(我知道这不是很科学。
请注意,这是在 32 位操作系统 - win2k3 上运行的 32 位代码。
我对挂钩机制的期望是错误的吗?我应该只激活我的应用还是需要其他类型的挂钩?
编辑:跟踪函数写入一个文件,告诉我什么发送给我激活
TIA。
【问题讨论】:
不清楚您的 TRACE 宏的作用。但是,您可能看不到它的副作用,因为它在另一个进程中运行。 特别是,它可能会记录到与您期望的目录不同的目录中的文件。 TRACE 是否关闭您正在写入的文件的句柄?由于不同的进程无法获取写锁,您可能会遇到并发问题。 CBTProc 不是也要导出吗? @Joel Lucsy:不,因为它是作为函数指针传递的。无需做任何动态链接。 【参考方案1】:结果它工作正常,正如 Hans 指出的那样,我只是没有看到其他进程的调试器的输出,如果我输入一些额外的跟踪代码 - 每个附加进程一个跟踪文件 - 我可以看到看看一切都在运作。
非常感谢您的回复。
【讨论】:
以上是关于SetWindowsHookex Global 不是很全球化的主要内容,如果未能解决你的问题,请参考以下文章
为啥必须将 SetWindowsHookEx 与 Windows 消息队列一起使用