我正在玩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_ATTACHs的数量,并且可以看到它在上升(我知道这不是很科学)。
请注意,这是在32位操作系统- win2k3上运行的32位代码。
我对挂钩机制的期望是否错了?我应该只激活我的应用程序,还是需要一种不同类型的钩子?
编辑:跟踪函数写到一个文件,告诉我什么是发送给我的激活。
蒂娅。
发布于 2012-01-19 16:39:52
事实证明它正常工作,正如Hans指出的那样,我只是看不到调试器来自其他进程的输出,如果我添加一些额外的跟踪代码--每个附加进程一个跟踪文件--我可以看到事情毕竟是正常的。
非常感谢你的答复。
https://stackoverflow.com/questions/8925882
复制相似问题