[英]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.