【发布时间】:2022-01-09 08:51:12
【问题描述】:
我需要能够确定消息要发送到哪个窗口,但我不明白如何正确执行。在WH_MOUSE 中有一个特殊的结构(MOUSEHOOKSTRUCT)存储了窗口的hwnd,但是在WH_KEYBOARD 哪里可以得到hwnd?
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)而不是当前窗口正是消息所针对的窗口这一事实。
【问题讨论】:
-
WH_KEYBOARD_LL 是一个全局挂钩。有了这个,一切对我来说都是正确的,因为我需要来自创建窗口的特定线程的消息。
标签: c++ c winapi setwindowshookex