我需要能夠確定訊息適用于哪個視窗,但我不明白如何正確執行此操作。InWH_MOUSE有一個特殊的結構 ( MOUSEHOOKSTRUCT) 來存盤視窗的 hwnd,但是從哪里獲取 hwndWH_KEYBOARD呢?
LRESULT CALLBACK messageHandler(int nCode, WPARAM wParam, LPARAM lParam)
{
// ???
}
DWORD WINAPI messageDispatcher(LPVOID thread)
{
hookHandle = SetWindowsHookEx(WH_KEYBOARD, 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;
}
理論上,我可以使用GetForegroundWindow,但在我看來這是一個糟糕的選擇,因為視窗可以從其他行程接收鍵盤訊息(如果另一個行程SendMessage向該視窗發送 a )而不是當前視窗將正是該訊息所針對的那個人。
uj5u.com熱心網友回復:
在生成鍵盤操作時,作業系統還不知道哪個視窗最終會收到訊息。這就是WH_KEYBOARD鉤子不提供 target 的原因HWND,就像WH_MOUSE鉤子一樣(因為滑鼠訊息攜帶與視窗相關的坐標)。
當鍵盤訊息被路由到目標時,訊息被傳遞到當前具有輸入焦點的視窗。
每關于鍵盤輸入:
系統將鍵盤訊息發送到創建具有鍵盤焦點的視窗的前臺執行緒的訊息佇列。鍵盤焦點是視窗的臨時屬性。系統通過將鍵盤焦點按照用戶的方向從一個視窗轉移到另一個視窗,在顯示幕上的所有視窗之間共享鍵盤。擁有鍵盤焦點的視窗接收(從創建它的執行緒的訊息佇列)所有鍵盤訊息,直到焦點改變到不同的視窗。
由于您的鉤子在目標執行緒的訊息佇列內部運行,因此您可以使用當時GetFocus()獲取目標HWND:
如果視窗附加到呼叫執行緒的訊息佇列,則檢索具有鍵盤焦點的視窗的句柄。
否則,您可以改用WH_CALLWNDPROC/RET鉤子,它會在訊息實際傳遞到視窗時呼叫。但是,您無法使用此掛鉤阻止訊息(正如您在上一個問題中所問的那樣)。
uj5u.com熱心網友回復:
我想你可能正在尋找的是一個型別的鉤子WH_JOURNALRECORD。
有了這個,Windows 將回應這個鉤子攔截的各種事件而呼叫的回呼程序是 型別的JournalRecordProc,lparam傳遞給這個函式的引數指向一個EVENTMSG結構,它看起來像這樣:
typedef struct tagEVENTMSG {
UINT message;
UINT paramL;
UINT paramH;
DWORD time;
HWND hwnd;
} EVENTMSG;
還有你的hwnd!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/372138.html
標籤:C C 登录 设置窗口shookex
