【问题标题】:Program stopps working at GetMessage() function程序在 GetMessage() 函数处停止工作
【发布时间】:2018-01-19 18:06:34
【问题描述】:

我对 Hook-Stuff 很陌生,我正在努力学习如何使用它。当我学习新东西时,我通常会从 Internet 上复制代码并查看它是否有效——如果可以,我会详细介绍并搜索所有内容。因此,对于我尝试过的所有代码,我都有同样的问题。他们停止在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);

它打印“钩子安装正确!”什么都不做!代码来自http://www.rohitab.com/discuss/topic/41238-global-hooks-to-intercept-windows-messages/

【问题讨论】:

  • GetMessage 是一个阻塞调用。为什么你没想到它会阻止?
  • 他们停止在 GetMessage() 函数上工作。 - 你在这个下面是什么意思?
  • 致反对者:是的,这个问题有点凌乱,代码可能不是很简单,但从根本上说,这似乎是一个真实的、可以回答的问题。一个好的答案会说 GetMessage 是一个阻塞调用,解释这意味着什么,并描述如何发送一些可能解除阻塞的消息。这似乎对未来的读者有用。

标签: c++ winapi hook


【解决方案1】:

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

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

【讨论】:

  • 没错,操作忽略了 get/dispatchmessage 用于的上下文,必须有一个 windows gui 才能使循环工作。
  • 非常感谢!我在互联网上没有找到任何关于此的内容,我不知道为什么我的问题被否决了..
  • @xlfastxikex:可能是由于缺乏研究,因为信息已经存在
  • 我知道我跑题了,但如果不是为了问我找不到答案的问题,这个论坛有什么用?搜索“PostThreadMessage”你是对的,有很多结果,但我无法搜索我什至不知道的东西。您可以尝试谷歌“GetMessage 冻结”甚至“GetMessage 阻止”,什么都没有..
【解决方案2】:

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

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

【讨论】:

  • 可能是对的,但这个问题没有足够的上下文来确定。旁注:你不需要有一个窗口。你可以PostThreadMessage你自己的消息。
  • 它可能回答了我的问题,但是 PostThreadMessage 是什么意思?
  • 消息队列与线程相关联,而不是与窗口相关联。每个线程在第一次调用 USER32 函数时都会创建一个消息队列。它不需要有一个窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 2013-11-11
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多