如何将其他应用程序窗口前面没有激活它?

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

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

它工作正常,但在一些(我不知道)的情况下,它使窗口总是在上面。 根据MSDN,我应该使用HWND_NOTOPMOST代替GetForegroundWindow()但是它不工作 – 窗口停留在其他窗口(并不总是在顶部)。

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

首先在SetWindowPos调用中将HWND_TOPMOST指定为“hWndInsertAfter”,然后在第二个调用中指定HWND_NOTOPMOST (两个调用都使用SWP_NOACTIVATE中的“ uFlags')。 如果由于操作的原因,可能会删除最顶层窗口的最顶层样式,那么可以事先调用GetWindowLong[Ptr]来测试WS_EX_TOPMOST ex样式。

如果有另外一个应用程序的窗口需要在前面(而不是在所有窗口的前面),那个窗口的所有者可以暂时地设置到它需要在前面的窗口。 具有GWL_HWNDPARENT GetWindowLong[Ptr]可用于存储窗口的原始所有者,然后调用SetWindowLong[Ptr]来设置临时所有者,随后使用HWND_TOP调用SetWindowPos ,然后再次使用SetWindowLong[Ptr]