程序停止在 GetMessage() 函数中工作

Program stopps working at GetMessage() function

本文关键字:函数 工作 GetMessage 程序      更新时间:2023-10-16

我对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!nn");
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/

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

安装挂钩的程序没有自己的窗口,因此不会收到任何消息。 这就是为什么GetMessage()无限期地阻止您的应用程序的原因。 您需要向应用程序添加 UI,或者让您的钩子使用 (Post|Send)Message()PostThreadMessage() 手动将其自己的消息发布/发送回您的应用程序,以便取消阻止GetMessage()

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

消息队列特定于创建窗口的线程,

发布的消息将始终在创建窗口的线程上接收,这就是Windows的操作方式。