我將首先描述我到底需要什么以及為什么。
我正在庫 (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_MOUSE和WH_KEYBOARD,而不是使用WH_GETMESSAGE.
但是,如果使用WH_GETMESSAGE不是一個壞主意,那么請幫助我制作它,以便我可以控制行程接收某些訊息(不要讓它們被行程看到)。
uj5u.com熱心網友回復:
我決定采用第一種方式并將 WH_GETMESSAGE 掛鉤放在創建視窗的執行緒的訊息上。但是,我阻止訊息的嘗試沒有成功。
根據檔案,WH_GETESSAGE鉤子不能阻止訊息,只能查看/修改它。當鉤子退出時,訊息總是被傳遞到目標執行緒:
GetMsgProc 回呼函式
GetMsgProc 掛鉤程序可以檢查或修改訊息。在鉤子程序將控制權回傳給系統后,GetMessage 或 PeekMessage 函式將訊息連同任何修改一起回傳給最初呼叫它的應用程式。
WH_MOUSE/_LL和WH_KEYBOARD/_LL鉤,在另一方面,可以阻止訊息,每各自的單證:
MouseProc 回呼函式
LowLevelMouseProc 回呼函式
KeyboardProc 回呼函式
LowLevelKeyboardProc 回呼函式
如果鉤子程序處理了訊息,它可能會回傳一個非零值以防止系統將訊息傳遞給鉤子鏈的其余部分或目標視窗程序。
像這樣...
或許更有經驗的程式員會告訴我,最好是做兩個鉤子,WH_MOUSE 和 WH_KEYBOARD,而不是使用 WH_GETMESSAGE。
您確實必須使用單獨的WH_MOUSE/WH_KEYBOARD鉤子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/372139.html
標籤:C C 登录 设置窗口shookex
上一篇:確定訊息發送到哪個視窗(SetWindowsHookEx&WH_KEYBOARD)
下一篇:C 如何在子視窗中實時顯示文本
