【问题标题】:Popup window unable to receive focus when top level window is minimized顶级窗口最小化时弹出窗口无法获得焦点
【发布时间】:2014-03-15 10:44:23
【问题描述】:

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

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

【问题讨论】:

    标签: c++ windows winapi popup setfocus


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我会尝试 1x1 窗口技巧。不确定通过循环传递的消息是什么意思,我对鼠标滚轮和键盘输入感兴趣,如果窗口没有焦点,显然不会发送...另外,有点不相关,有什么方法可以防止当我点击我的弹出窗口时任务栏不显示(它显示在通常覆盖任务栏的全屏游戏上)?
    • 查看编辑。焦点主要适用于键盘,而不是鼠标。最上面的窗口或全屏 DC 是隐藏任务栏的方法。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多