SetWindowPos 函数 (winuser.h)

更改子窗口、弹出窗口或顶级窗口的大小、位置和 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 顺序中定位的窗口之前。 此参数必须是窗口句柄或以下值之一。

含义
HWND_BOTTOM
(HWND) 1
Places Z 顺序底部的窗口。 如果 hWnd 参数标识最顶层的窗口,该窗口将失去其最顶层的状态,并放置在所有其他窗口的底部。
HWND_NOTOPMOST
(HWND) -2
Places所有非最顶层窗口上方的窗口 (,即) 所有最顶层窗口的后面。 如果窗口已经是非最顶部窗口,则此标志不起作用。
HWND_TOP
(HWND) 0
Places Z 顺序顶部的窗口。
HWND_TOPMOST
(HWND) -1
将窗口置于所有非最顶部窗口的上面。 该窗口即使已停用,也会保留在最高位置。
 

有关如何使用此参数的详细信息,请参阅以下“备注”部分。

[in] X

类型: int

以客户端坐标表示的窗口左侧的新位置。

[in] Y

类型: int

以客户端坐标表示的窗口顶部的新位置。

[in] cx

类型: int

窗口的新宽度(以像素为单位)。

[in] cy

类型: int

窗口的新高度(以像素为单位)。

[in] uFlags

类型: UINT

窗口大小调整和定位标志。 此参数可以是以下值的组合。

含义
SWP_ASYNCWINDOWPOS
0x4000
如果调用线程和拥有窗口的线程附加到不同的输入队列,则系统会将请求发布到拥有窗口的线程。 这可以防止调用线程阻止其执行,而其他线程处理请求。
SWP_DEFERERASE
0x2000
阻止生成 WM_SYNCPAINT 消息。
SWP_DRAWFRAME
0x0020
在窗口的类说明) 围绕窗口绘制 (定义的框架。
SWP_FRAMECHANGED
0x0020
使用 SetWindowLong 函数应用新框架样式集。 向窗口发送 WM_NCCALCSIZE 消息,即使窗口的大小未更改也是如此。 如果未指定此标志,则仅在更改窗口大小时发送 WM_NCCALCSIZE
SWP_HIDEWINDOW
0x0080
隐藏窗口。
SWP_NOACTIVATE
0x0010
不激活窗口。 如果未设置此标志,则会激活窗口并将其移动到最顶层或非最顶部组 (的顶部,具体取决于 hWndInsertAfter 参数) 的设置。
SWP_NOCOPYBITS
0x0100
丢弃工作区的整个内容。 如果未指定此标志,则会保存工作区的有效内容,并在调整窗口大小或重新定位后复制回工作区。
SWP_NOMOVE
0x0002
保留当前位置 (忽略 XY 参数) 。
SWP_NOOWNERZORDER
0x0200
不更改所有者窗口在 Z 顺序中的位置。
SWP_NOREDRAW
0x0008
不重绘更改。 如果设置了此标志,则不执行任何形式的重绘。 这适用于工作区、非工作区 (包括标题栏和滚动条) ,以及由于窗口移动而发现父窗口的任何部分。 设置此标志后,应用程序必须显式使需要重绘的窗口和父窗口的任何部分失效或重绘。
SWP_NOREPOSITION
0x0200
SWP_NOOWNERZORDER 标志相同。
SWP_NOSENDCHANGING
0x0400
阻止窗口接收 WM_WINDOWPOSCHANGING 消息。
SWP_NOSIZE
0x0001
保留当前大小 (忽略 cxcy 参数) 。
SWP_NOZORDER
0x0004
保留当前 Z 顺序 (忽略 hWndInsertAfter 参数) 。
SWP_SHOWWINDOW
0x0040
显示“接收端口跟踪选项” 窗口。

返回值

类型: BOOL

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 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_NOACTIVATESWP_NOZORDER 标志均未指定 (即,当应用程序请求同时激活窗口且其 Z 顺序中的位置) 更改时,仅在以下情况下使用 hWndInsertAfter 中指定的值。

  • hWndInsertAfter 中未指定 HWND_TOPMOSTHWND_NOTOPMOST 标志。
  • hWnd 标识的窗口不是活动窗口。
应用程序无法激活非活动窗口,而无需同时将其置于 Z 顺序的顶部。 应用程序可以不受限制地更改已激活窗口在 Z 顺序中的位置,也可以激活窗口,然后将其移动到最顶部或非最顶部窗口的顶部。

如果将最顶层窗口重新定位到 Z 顺序的底部 (HWND_BOTTOM) ,或者在任何非最顶部窗口之后,则它不再是最顶部窗口。 当最顶部的窗口成为非最顶部窗口时,其所有者及其拥有的窗口也成为非最顶部的窗口。

非最顶部窗口可以拥有最顶部的窗口,但不能发生相反的情况。 例如,任何窗口 (,) 由最顶部窗口拥有的对话框本身都会成为最顶部的窗口,以确保所有拥有的窗口都高于其所有者。

如果应用程序不在前台,并且应位于前台,则必须调用 SetForegroundWindow 函数。

若要使用 SetWindowPos 将窗口置于顶部,拥有该窗口的进程必须具有 SetForegroundWindow 权限。

示例

有关示例,请参阅 初始化对话框

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 winuser.h (包括 Windows.h)
Library User32.lib
DLL User32.dll
API 集 在 Windows 8) 中引入的 ext-ms-win-ntuser-window-l1-1-0 (

请参阅

概念性

MoveWindow

引用

SetActiveWindow

SetForegroundWindow

Windows