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 顺序中定位窗口之前窗口的句柄。 此参数必须是窗口句柄或以下值之一。

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

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

[in] X

类型: int

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

[in] Y

类型: int

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

[in] cx

类型: int

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

[in] cy

类型: int

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

[in] uFlags

类型: UINT

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

Value 含义
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_TOPMOST标志和HWND_NOTOPMOST标志。
  • hWnd 标识的窗口不是活动窗口。
应用程序无法激活非活动窗口,而无需将其置于 Z 顺序的顶部。 应用程序可以在 Z 顺序中更改已激活窗口的位置,但不受限制,也可以激活窗口,然后将其移动到最顶部或最顶层窗口的顶部。

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

非最顶层窗口可以拥有最顶层的窗口,但反向窗口无法发生。 例如,任何窗口) (,由最顶层窗口拥有的对话框本身都是最顶层的窗口,以确保所有拥有的窗口都停留在其所有者之上。

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

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

示例

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

要求

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

另请参阅

概念性

MoveWindow

参考

SetActiveWindow

SetForegroundWindow

Windows