我对Hook-Stuff很新,我正在努力学习如何使用它。当我学习新东西时,我通常从互联网上复制代码并查看它是否有效 - 如果是,我会详细介绍并搜索所有内容。所以我试过的所有代码都有同样的问题。他们停止在GetMessage()
功能工作。我正在使用Visual Studio - 我对它进行了调试,当它到达函数时它只会停留在它上面。
我尝试了几个代码 - 例如这个:
HMODULE lib = LoadLibrary("C:\\Users\\A\\Desktop\\Dll1.dll");
if (lib) {
HOOKPROC procedure = (HOOKPROC)GetProcAddress(lib, "_procedure@12");
if (procedure)
hook = SetWindowsHookEx(WH_CALLWNDPROC, procedure, lib, 0);
else
printf("Can't find function in dll!\n");
}
else
printf("Can't find dll!\n");
if (hook)
printf("Hook installed properly!\n\n");
MSG message;
while (GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
FreeLibrary(lib);
UnhookWindowsHookEx(hook);
打印“Hook已正确安装!”并没有做任何事!代码来自http://www.rohitab.com/discuss/topic/41238-global-hooks-to-intercept-windows-messages/
答案 0 :(得分:1)
与鼠标/键盘钩子不同,窗口过程钩子在调用窗口过程的钩子线程的上下文中运行。它不会像您期望的那样委托给安装了挂钩的线程。这就是为什么在挂钩其他进程时DLL中必须存在一个窗口过程挂钩 - DLL被注入到挂钩进程的地址空间中,然后钩子被任何挂钩线程在将消息传递给窗口之前/之后调用过程
正在安装挂钩的程序没有自己的窗口,因此没有收到任何消息。这就是GetMessage()
无限期阻止您的应用的原因。您需要在应用中添加用户界面,或者使用(Post|Send)Message()
或PostThreadMessage()
手动将自己的消息发布/发送回应用,以取消阻止GetMessage()
。< / p>
答案 1 :(得分:0)
你的程序不会接收消息,除非它创建窗口,钩子作为钩子程序的消息循环的一部分传递(这就是为什么钩子函数需要在这种情况下的DLL中)。 / p>
消息队列特定于创建窗口的线程,发布的消息总是在创建窗口的线程上接收,这就像Windows操作的方式。