我正在玩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。
答案 0 :(得分:0)
原来它的工作正常,正如Hans指出的那样,我只是没有看到调试器的输出来自其他进程,如果我输入一些额外的跟踪代码 - 每个附加进程一个跟踪文件 - 我可以看到毕竟看到事情正在发挥作用。
非常感谢回复。