首页 > 解决方案 > windows操作系统如何确定应该将消息发布到哪个窗口

问题描述

问题:

假设我有一个带有主窗口和子窗口的进程。当我使用键盘键入时,操作系统如何确定要向其发送 WM_KEYDOWN 消息的 HWND?

我知道事件循环和函数 GetMessage、TranslateMessage 和 DispatchMessage,但我不明白如何在 MSG 结构中设置 hwnd 字段。

例子:

使用 Spy++ 我看到有时子窗口会收到 WM_KEYDOWN 消息,有时会收到父窗口。

在 winforms 中,具有焦点的文本框接收消息。但是在其他 UI 中,消息会跳过子窗口并直接发布到主窗口。

标签: windowswinapi

解决方案


输入被发送到具有焦点的窗口

根据 MSalters 的评论:

GITHREADINFO结构包含变量:

HWND  hwndFocus;

Type: HWND

A handle to the window that has the keyboard focus.

这是默认行为。如果程序将消息转发到另一个窗口,则该行为是由开发人员实现的。

检测和处理输入的方法有很多,但标准方法是使用消息队列。您可能会发现程序在没有焦点的情况下检测输入,这可能是因为它们使用了另一种读取输入的方法,例如 GetKeyboardState()。


推荐阅读