我试图从其他窗口获取一些消息。我需要按名称查找窗口,我使用了FindWindowW()
。如何获取活动窗口并从中获取消息?当我在GetMessage((中添加hwnd
时,它不起作用。
//WndProc
case WM_KEYDOWN:
OutputDebugStringW(L"Key down");
break;
//main.c
//WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
hwnd = FindWindowW(NULL, L"Sublime Text");
while (GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
只有创建窗口的线程才能直接接收和调度该窗口的消息。GetMessage()
从调用线程的消息队列中检索消息,因此它只能与调用线程拥有的窗口一起使用。
由于您试图捕获不属于您的窗口的消息,因此必须使用SetWindowsHookEx()
或SetWinEventHook()
在该窗口的所属线程中安装挂钩回调,然后该回调可以截获该窗口所需的消息/事件。您可以使用GetWindowThreadProcessId()
来获取拥有该窗口的进程和线程的ID。
如果您使用SetWindowsHookEx()
并试图挂接另一个进程中的窗口,则回调必须驻留在DLL中,以便将其注入该进程。您不需要对SetWinEventHook()
执行此操作。