在GetMessage()函数

时间:2018-01-19 18:06:34

标签: c++ winapi hook

我对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/

2 个答案:

答案 0 :(得分:1)

与鼠标/键盘钩子不同,窗口过程钩子在调用窗口过程的钩子线程的上下文中运行。它不会像您期望的那样委托给安装了挂钩的线程。这就是为什么在挂钩其他进程时DLL中必须存在一个窗口过程挂钩 - DLL被注入到挂钩进程的地址空间中,然后钩子被任何挂钩线程在将消息传递给窗口之前/之后调用过程

正在安装挂钩的程序没有自己的窗口,因此没有收到任何消息。这就是GetMessage()无限期阻止您的应用的原因。您需要在应用中添加用户界面,或者使用(Post|Send)Message()PostThreadMessage()手动将自己的消息发布/发送回应用,以取消阻止GetMessage()。< / p>

答案 1 :(得分:0)

你的程序不会接收消息,除非它创建窗口,钩子作为钩子程序的消息循环的一部分传递(这就是为什么钩子函数需要在这种情况下的DLL中)。 / p>

消息队列特定于创建窗口的线程,发布的消息总是在创建窗口的线程上接收,这就像Windows操作的方式。