簡體   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