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

C++ 如何在不激活其他应用程序窗口的情况下将其置于前端?,c++,windows,winapi,z-order,C++,Windows,Winapi,Z Order,我想把一个窗口带到前面(来自其他应用程序)。目前我正在使用: ::SetWindowPos(hwnd, GetForegroundWindow(), 0, 0, 0, 0, SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); 它工作得很好,但在某些情况下(我不知道),它使窗口始终位于顶部。根据MSDN,我应该使用HWND_NOTOPMOST来代替GetForegroundWindow(),但它不起作用,因为窗口位于其他

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

::SetWindowPos(hwnd, GetForegroundWindow(), 0, 0, 0, 0, SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
它工作得很好,但在某些情况下(我不知道),它使窗口始终位于顶部。根据MSDN,我应该使用
HWND_NOTOPMOST
来代替
GetForegroundWindow()
,但它不起作用,因为窗口位于其他窗口(不总是在顶部)下


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

另一个应用程序的窗口可以临时设置为“最上面”,以便在不激活窗口的情况下将其置于最前面,首先,在
SetWindowPos
调用中将
HWND\u-TOPMOST
指定为“hWndInsertAfter”,然后在第二个调用中指定
HWND\u-NOTOPMOST
(在“uFlags”中使用
SWP\u-NOACTIVATE
)。如果由于该操作而存在删除窗口最顶端样式的风险,则可以通过调用
GetWindowLong[Ptr]
预先测试
WS_EX\u TOPMOST
EX样式


如果另一个应用程序的窗口需要位于某个特定窗口的前面(而不是位于所有窗口的前面),则可以将该窗口的所有者再次临时设置为它需要位于前面的窗口
GetWindowLong[Ptr]
with
GWL\u HWNDPARENT
可用于存储窗口的原始所有者,然后调用
SetWindowLong[Ptr]
设置临时所有者,然后调用
SetWindowPos
with
HWND\u TOP
,然后再次调用
SetWindowLong[Ptr]恢复原始所有者

文档中说,
HWND_NOTOPMOST
“如果窗口已经是非最顶端的窗口,则无效”。这里有一些备选方案:对其他问题提出的答案都不是好的解决方案。整个问题都是一团糟。大卫在这里得到了你的答案。我想我不能使用这些选项——所有的选项(我认为)都激活了窗口,我不能这样做。我已经删除了我的答案。它不起作用。我不认为你能在不接管输入焦点的情况下做到这一点。我认为窗口管理器的设计目的是让用户决定哪个窗口位于顶部,而不是程序。@David-是的,在W7上进行了测试,例如,我可以在不激活的情况下将“记事本”窗口置于顶部。