繁体   English   中英

使用挂钩 (SetWindowsHookEX & WH_GETMESSAGE)

[英]Working with hooks (SetWindowsHookEX & WH_GETMESSAGE)

我将首先描述我到底需要什么以及为什么。

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

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

我决定采用第一种方式 go 并在创建 window 的线程的消息上放置一个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不是一个坏主意,那么请帮我制作它,以便我可以控制进程对某些消息的接收(不允许它们被进程看到)。

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

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

GetMsgProc 回调 function

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

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

MouseProc 回调 function

LowLevelMouseProc 回调 function

KeyboardProc 回调 function

LowLevelKeyboardProc 回调 function

如果钩子程序处理了消息,它可能会返回一个非零值,以防止系统将消息传递给钩子链的 rest 或目标 window 程序。

像这样...

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM