2011-03-10 104 views
7

我想带一个窗口(来自其他应用程序)。目前我使用:如何将其他应用程序窗口置于前面而不激活它?

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

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

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

+0

如果窗口已经是非最顶层的窗口,文档说'HWND_NOTOPMOST'“不起作用。 – 2011-03-10 10:03:43

+0

这里的一些替代方法:http://stackoverflow.com/questions/916259/win32-bring-a-window-to-top – 2011-03-10 10:05:36

+0

*无*提出的其他问题的答案是一个很好的解决方案。整个问题只是一团糟。大卫在这里得到了你的答案。 – 2011-03-10 10:09:03

回答

11

其它应用程序的窗口可以被暂时制成“最上面的”来把它前面而不激活它,首先通过在一SetWindowPos呼叫指定HWND_TOPMOST为“hWndInsertAfter”,然后通过在第二呼叫指定HWND_NOTOPMOST(两个通话与'uFlags'中的SWP_NOACTIVATE)。如果由于操作的原因可能会移除已经是最顶层窗口的最顶层样式,则可以通过致电GetWindowLong[Ptr]预先测试WS_EX_TOPMOST ex样式。

如果有其他应用程序的窗口需要在前面的特定窗口(与在所有窗口前面相反),那个窗口的所有者可以临时再次设置到它需要在前面的窗口。 GetWindowLong[Ptr]GWL_HWNDPARENT可用于存储窗口的原始所有者,然后调用SetWindowLong[Ptr]来设置临时所有者,然后调用SetWindowPosHWND_TOP,然后再用SetWindowLong[Ptr]恢复原始所有者。

+0

当窗口没有输入焦点时,这是否工作? – 2011-03-10 13:56:01

+0

@David - 是的,在W7上进行测试,例如我可以将“记事本”窗口置于顶部而不激活它。 – 2011-03-10 14:46:13

相关问题