【问题标题】:Working with hooks (SetWindowsHookEX & WH_GETMESSAGE)使用挂钩 (SetWindowsHookEX & WH_GETMESSAGE)
【发布时间】:2022-01-09 07:20:05
【问题描述】:

我将首先描述我究竟需要什么以及为什么。

我正在库 (dll) 中制作游戏内界面,我需要能够接收和删除消息(阻止目标进程接收它们),具体取决于代码中的不同条件。

除了来自鼠标和键盘的消息,我不需要其他任何东西。为此,有两种方法。找一种可以让我从鼠标和键盘接收消息的钩子,或者在鼠标和键盘上放置两个单独的钩子,但代码会比一个钩子多得多。

我决定采用第一种方式,并在创建窗口的线程的消息上放置一个WH_GETMESSAGE 挂钩。但是,我阻止该消息的尝试失败了。

LRESULT CALLBACK messageHandler(int nCode, WPARAM wParam, LPARAM lParam)
{
    return -1; // This works fine with WH_MOUSE or WH_KEYBOARD, but for some reason, with the WH_GETMESSAGE hook, the process still receives a message
}
 
DWORD WINAPI messageDispatcher(LPVOID thread)
{
    hookHandle = SetWindowsHookEx(WH_GETMESSAGE, messageHandler, GetModuleHandle(nullptr), *reinterpret_cast<DWORD*>(thread));
 
    if (!hookHandle)
    {
        return GetLastError();
    }
 
    MSG message{};
 
    while (GetMessage(&message, 0, 0, 0) > 0)
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
 
    return 0;
}

我不确定WH_GETMESSAGE 是否适合我。也许更有经验的程序员会告诉我,最好使用两个钩子,例如WH_MOUSEWH_KEYBOARD,而不是使用WH_GETMESSAGE

但是,如果,尽管如此,使用WH_GETMESSAGE 不是一个坏主意,那么请帮我制作它,以便我可以控制进程对某些消息的接收(不允许它们被进程看到) .

【问题讨论】:

  • 请帮帮我。我在另一个论坛上已经在 stackoverflow 上问过这个问题两次和三次。
  • "我在另一个论坛上已经在 stackoverflow 上问过这个问题两次和三次" - 如果你没有得到你需要的答案,这可能是一个很好的迹象你可能问错了问题,或者问的方式不对。
  • @500-InternalServerError 鼠标/键盘活动通过线程的消息队列。当从队列中调度时,它们将被转发到一个窗口。

标签: c++ c winapi setwindowshookex


【解决方案1】:

我决定采用第一种方式,并将 WH_GETMESSAGE 钩子放在创建窗口的线程的消息上。但是,我阻止该消息的尝试没有成功。

根据文档,WH_GETESSAGE 钩子不能阻止消息,只能查看/修改它。当钩子退出时,消息总是传递到目标线程:

GetMsgProc callback function

GetMsgProc 挂钩过程可以检查或修改消息。在挂钩过程将控制权返回给系统后,GetMessage 或 PeekMessage 函数将消息以及任何修改返回给最初调用它的应用程序。

另一方面,WH_MOUSE/_LLWH_KEYBOARD/_LL 挂钩可以根据各自的文档阻止消息:

MouseProc callback function

LowLevelMouseProc callback function

KeyboardProc callback function

LowLevelKeyboardProc callback function

如果钩子过程处理了消息,它可能会返回一个非零值,以防止系统将消息传递给钩子链的其余部分或目标窗口过程。

这样……

也许更有经验的程序员会告诉我,最好使用两个挂钩,例如 WH_MOUSE 和 WH_KEYBOARD,而不是使用 WH_GETMESSAGE。

您确实必须使用单独的 WH_MOUSE/WH_KEYBOARD 挂钩。

【讨论】:

  • 你是在说 WH_GETMESSAGE 还是所有的钩子?简单地说,使用 WH_MOUSE 和 WH_KEYBOARD 就可以了。
  • 只有特定的钩子可以阻止消息。 WH_GETMESSAGE 不是其中之一。 WH_MOUSE 和 WH_KEYBOARD 是。我已经更新了我的答案。
  • 我明白了,非常感谢。那么 return -1 呢,这是正确的方法还是以某种不同的方式更好?
  • @AugustVishnevsky 在我引用的文档中提到:“return a nonzero value”。这意味着操作系统不关心您返回的具体值,只要它满足该要求即可。 -1 是一个非零值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多