我正在尝试学习 Windows API。目前我在尝试让钩子(Hook)工作时遇到了很多麻烦。我有一些我已经弄乱了几天的示例代码——它有一个用 C# 或其他东西编写的 GUI,以及一个用 C++ 编写的 dll。 dll 具有外部化的功能:
bool __declspec(dllexport) InstallHook(){
g_hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, g_hInstance, 0);
return g_hHook != NULL;
}
CBT Proc是这个,也是在dll中:
LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam){
if (nCode < 0)
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
/* Something should go here to do stuff when certain nCodes are recieved.*/
return 0;
}
当我运行这些代码时,一切正常。他有一个 InstallHook() 调用埋在他的 C# GUI 中,如果我在 CBTProc 函数中放置一个断点,我可以看到它被系统一遍又一遍地调用。由于我不太了解 C#,因此我尝试使用以下(微型)控制台应用程序将其删除:
int _tmain(int argc, _TCHAR* argv[]){
bool bbbb = InstallHook();
Sleep(2000);
return 0;
}
我的问题是,如果我这样做, Hook 将不再起作用。通过调试器,我可以看到 InstallHook() 被正确调用,并且该函数中的 g_hHook 不为空,但 CBTProc 函数根本没有被调用——就好像系统一离开 InstallHook 就忘记了钩子(Hook)() 函数。
谁能阐明这个问题?几天来我一直在努力尝试让它发挥作用,但我没有运气。
最佳答案
我怀疑这是因为您有控制台应用程序,而系统不发送有关控制台窗口的激活、创建、移动等的通知。尝试使其成为普通的 Windows 应用程序。
关于c++ - SetWindowsHookEx() ,钩子(Hook)不维护? (可能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2366468/