[英]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_MOUSE
和WH_KEYBOARD
,而不是使用WH_GETMESSAGE
。
但是,如果使用WH_GETMESSAGE
不是一个坏主意,那么请帮我制作它,以便我可以控制进程对某些消息的接收(不允许它们被进程看到)。
我决定采用第一种方式 go 并将 WH_GETMESSAGE 钩子放在创建 window 的线程的消息上。 但是,我阻止该消息的尝试没有成功。
根据文档, WH_GETESSAGE
挂钩不能阻止消息,只能查看/修改它。 当钩子退出时,消息总是被传递到目标线程:
GetMsgProc 挂钩过程可以检查或修改消息。 在挂钩过程将控制权返回给系统后,GetMessage 或 PeekMessage function 会将消息以及任何修改返回给最初调用它的应用程序。
另一方面,WH_MOUSE/ WH_MOUSE/_LL
和WH_KEYBOARD/_LL
钩子可以根据各自的文档阻止消息:
LowLevelKeyboardProc 回调 function
如果钩子程序处理了消息,它可能会返回一个非零值,以防止系统将消息传递给钩子链的 rest 或目标 window 程序。
像这样...
也许更有经验的程序员会告诉我,最好使用两个钩子,WH_MOUSE 和 WH_KEYBOARD,而不是使用 WH_GETMESSAGE。
您确实必须使用单独的WH_MOUSE
/ WH_KEYBOARD
挂钩。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.