【发布时间】:2020-07-11 04:53:20
【问题描述】:
问题:
假设我有一个带有主窗口和子窗口的进程。当我使用键盘键入时,操作系统如何确定要向其发送 WM_KEYDOWN 消息的 HWND?
我知道事件循环和函数GetMessage、TranslateMessage和DispatchMessage,但我不明白hwnd字段是如何在MSG结构中设置的。
示例:
使用 Spy++ 我看到有时子窗口会收到 WM_KEYDOWN 消息,有时会收到父窗口。
在 winforms 中,具有焦点的文本框接收消息。但是在其他 UI 中,消息会跳过子窗口并直接发布到主窗口。
【问题讨论】:
-
进入焦点窗口。
-
如
GUITHREADINFO::hwndFcous。还有Keyboard input model。子窗口可以通过捕获WM_SETFOCUS并将焦点设置到其父窗口来拒绝焦点。 -
"但是在其他 UI 中,消息会跳过子窗口并直接发布到主窗口。"你能举一个这种用户界面的例子吗?
-
@RitaHan-MSFT ,这是一个大型机模拟器。我不知道我是否可以提及 UI 的名称,但基本上它有一个顶级窗口和一个子窗口,即终端本身,但是子窗口不接收键盘输入,只有父窗口。我猜在这个特定的应用程序中,只有顶级窗口具有键盘焦点并处理键盘事件。
-
@EtanGrundstein:
GetGUIThreadInfo也应该适用于其他进程。如果您明确将WM_KEYDOWN发送给孩子,它可以以编程方式将其重新发送给其父母。这只是几行代码。这种转发甚至可以是有条件的,具体取决于密钥和其他因素; Windows 对这种逻辑一无所知。 Windows 只处理第一次传递给焦点 HWND。