SetWindowsHookex Global不是非常全球化

时间:2012-01-19 12:17:36

标签: winapi global setwindowshookex

我正在玩SetWindowsHookEx,特别是我希望能够通过鼠标或键盘找到已激活的任何窗口(在我的桌面上)。

通过阅读SetWindowsHookEx的MSDN文档,看起来WH_CBT类型可以完成这项工作。我已经创建了一个dll并将所有代码放在那里,我从一个gui应用程序控制它(它也处理了取消挂钩)。

但是,当我激活我的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位操作系统上运行的32位代码 - win2k3。

我对挂钩机制的期望是错误的吗?我应该只是激活我的应用程序还是需要不同类型的钩子?

编辑:跟踪功能写入文件,告诉我发送激活的信息

TIA。

1 个答案:

答案 0 :(得分:0)

原来它的工作正常,正如Hans指出的那样,我只是没有看到调试器的输出来自其他进程,如果我输入一些额外的跟踪代码 - 每个附加进程一个跟踪文件 - 我可以看到毕竟看到事情正在发挥作用。

非常感谢回复。