0

我正在玩 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。

4

1 回答 1

0

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

非常感谢您的回复。

于 2012-01-19T16:39:52.127 回答