如何在不激活的情况下将其他应用程序窗口置于前面?

时间:2011-03-10 09:56:02

标签: c++ windows winapi z-order

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

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

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

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

1 个答案:

答案 0 :(得分:11)

另一个应用程序的窗口可以临时“最顶层”,无需激活它,首先在HWND_TOPMOST调用中将SetWindowPos指定为'hWndInsertAfter',然后指定{第二次调用{1}}(在'uFlags'中调用HWND_NOTOPMOST)。如果由于操作而有可能删除已经是最顶层的窗口的最顶层样式,则可以事先通过调用SWP_NOACTIVATE来测试WS_EX_TOPMOST前样式。

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