更改子窗口、弹出窗口或顶级窗口的大小、位置和 Z 顺序。 这些窗口根据其在屏幕上的外观进行排序。 最上面的窗口接收最高排名,是 Z 顺序中的第一个窗口。
BOOL SetWindowPos(
[in] HWND hWnd,
[in, optional] HWND hWndInsertAfter,
[in] int X,
[in] int Y,
[in] int cx,
[in] int cy,
[in] UINT uFlags
[in] hWnd
类型:HWND
窗口的句柄。
[in, optional] hWndInsertAfter
类型:HWND
窗口的句柄,用于在 Z 顺序中定位的窗口之前。 此参数必须是窗口句柄或以下值之一。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
作为 Vista 重新体系结构的一部分,所有服务都从交互式桌面移动到会话 0。 hwnd 和窗口管理器操作仅在会话内有效,并且跨会话操作 hwnd 的尝试将失败。 有关详细信息,请参阅 Windows Vista 开发人员案例:应用程序兼容性指南。
如果使用 SetWindowLong 更改了某些窗口数据,则必须调用 SetWindowPos 才能使更改生效。 对 uFlags 使用以下组合: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED。
通过将 hWndInsertAfter 参数设置为 HWND_TOPMOST 并确保未设置 SWP_NOZORDER 标志,或者将窗口的位置设置为 Z 顺序,使其位于任何现有最顶部窗口之上,可以将窗口设置为最顶层窗口。 当非最顶部窗口成为最顶部窗口时,它拥有的窗口也将成为最顶部窗口。 但是,其所有者不会更改。
如果 SWP_NOACTIVATE 和 SWP_NOZORDER 标志均未指定 (即,当应用程序请求同时激活窗口且其 Z 顺序中的位置) 更改时,仅在以下情况下使用 hWndInsertAfter 中指定的值。
hWndInsertAfter 中未指定 HWND_TOPMOST 和 HWND_NOTOPMOST 标志。
hWnd 标识的窗口不是活动窗口。
应用程序无法激活非活动窗口,而无需同时将其置于 Z 顺序的顶部。 应用程序可以不受限制地更改已激活窗口在 Z 顺序中的位置,也可以激活窗口,然后将其移动到最顶部或非最顶部窗口的顶部。
如果将最顶层窗口重新定位到 Z 顺序的底部 (HWND_BOTTOM) ,或者在任何非最顶部窗口之后,则它不再是最顶部窗口。 当最顶部的窗口成为非最顶部窗口时,其所有者及其拥有的窗口也成为非最顶部的窗口。
非最顶部窗口可以拥有最顶部的窗口,但不能发生相反的情况。 例如,任何窗口 (,) 由最顶部窗口拥有的对话框本身都会成为最顶部的窗口,以确保所有拥有的窗口都高于其所有者。
如果应用程序不在前台,并且应位于前台,则必须调用 SetForegroundWindow 函数。
若要使用 SetWindowPos 将窗口置于顶部,拥有该窗口的进程必须具有 SetForegroundWindow 权限。
有关示例,请参阅 初始化对话框。