当顶级窗口最小化时,弹出窗口无法获得焦点

时间:2014-03-15 10:44:24

标签: c++ windows winapi popup setfocus

我创建了一个弹出窗口(WS_POPUPWS_EX_TOPMOSTWS_EX_TOOLWINDOW),可以在点击时获得焦点(通过调用SetFocus处理程序中的WM_LBUTTONDOWN)。一切正常,直到我最小化主应用程序窗口(弹出窗口仍然可见) - 现在当我点击弹出窗口时,它立即失去焦点。为什么会发生这种情况,弹出窗口是否应该与主窗口完全无关,因为它不是孩子或任何东西?

更新:这似乎与WS_POPUP有关。在主应用程序窗口最小化时尝试单击窗口会闪烁其任务栏图标并立即终止焦点。

2 个答案:

答案 0 :(得分:1)

单击窗口的目的是激活应用程序。如果某个窗口可见但未拥有(如您的情况),则单击该窗口时Windows无法激活该应用程序。这是您所看到的(预期)行为。

如果您想要完成某些特定内容,那么您应该仍然可以通过消息循环看到该窗口的消息。键盘消息仅发送到具有焦点的窗口。鼠标消息被发送到捕获鼠标的窗口(如果有的话),或者鼠标指针下面的最顶层窗口(通过命中测试找到)是否有焦点。如果需要,可以将各种其他消息发送到窗口(例如,绘画)。

如果您希望弹出窗口获得焦点,那么必须具有可以激活的顶级父窗口。通常的解决方案是创建一个不可见的顶级窗口(1个像素或关闭屏幕)作为其父级。

答案 1 :(得分:0)

找到一个有趣的解决方案,恰好解决了我的其他问题(如果弹出窗口显示在全屏游戏上,单击它将导致任务栏出现) - 我使窗口透明(WS_EX_TRANSPARENT)和通过系统范围的钩子处理鼠标和键盘。唯一的缺点是我必须让鼠标移动,因为阻止它会导致光标停止(因此,我无法更改光标,因为弹出窗口后面的应用程序只会将其更改回来)。