7

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

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

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

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

4

1 回答 1

12

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

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

于 2011-03-10T13:54:31.313 回答