【问题标题】:How to bring other app window to front without activating it?如何在不激活其他应用程序窗口的情况下将其置于前面?
【发布时间】:2011-03-10 09:56:02
【问题描述】:

我想把一个窗口放在前面(来自其他应用程序)。目前我正在使用:

::SetWindowPos(hwnd, GetForegroundWindow(), 0, 0, 0, 0, SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);

它工作正常,但在某些(我不知道的)情况下,它会使窗口始终位于顶部。根据 MSDN,我应该使用 HWND_NOTOPMOST 代替 GetForegroundWindow(),但它不起作用——窗口停留在其他(并不总是在顶部)窗口之下。

如何在不激活的情况下将窗口置于前面?

【问题讨论】:

  • 文档说HWND_NOTOPMOST“如果窗口已经是非最顶层窗口则无效”。
  • None 对另一个问题的建议答案是一个很好的解决方案。整个问题只是一团糟。大卫在这里得到了你的答案。
  • 我认为我不能使用那些替代品 - 所有这些(我认为)都激活窗口,我不能这样做。
  • 我已经删除了我的答案。它不起作用。我认为你不能在不接管输入焦点的情况下做到这一点。我认为窗口管理器旨在让用户决定哪个窗口位于顶部而不是程序。

标签: c++ windows winapi z-order


【解决方案1】:

另一个应用程序的窗口可以临时设置为“最顶层”以将其置于最前面而不激活它,首先通过在SetWindowPos 调用中将HWND_TOPMOST 指定为“hWndInsertAfter”,然后在调用中指定HWND_NOTOPMOST第二次通话(在'uFlags'中都使用SWP_NOACTIVATE进行通话)。如果由于操作而存在删除已经是最顶层的窗口的最顶层样式的风险,则可以通过调用 GetWindowLong[Ptr] 预先测试 WS_EX_TOPMOST 前样式。

如果有一个特定的窗口需要其他应用程序的窗口在前面(而不是在所有窗口的前面),则该窗口的所有者可以再次临时设置为它需要在前面的窗口。 GetWindowLong[Ptr]GWL_HWNDPARENT 可用于存储窗口的原始所有者,然后调用 SetWindowLong[Ptr] 设置临时所有者,然后调用 SetWindowPosHWND_TOP,然后使用再次SetWindowLong[Ptr]

【讨论】:

  • @David - 是的,在 W7 上测试过,例如我可以在不激活的情况下将“记事本”窗口置于顶部。
猜你喜欢
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 2013-05-15
  • 2023-03-24
  • 2015-04-03
相关资源
最近更新 更多