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
Places 所有非最上層視窗上方的視窗。 即使視窗已停用,視窗仍會維持最上層的位置。
 

如需如何使用此參數的詳細資訊,請參閱下列一節。

[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 中指定的值。

  • HWND_TOPMOSTHWND_NOTOPMOST旗標都未在 hWndInsertAfter 中指定。
  • hWnd 所識別的視窗不是使用中的視窗。
應用程式無法啟用非使用中的視窗,而不需將它帶入 Z 順序的頂端。 應用程式可以在 Z 順序中變更已啟用視窗的位置,而不受限制,也可以啟動視窗,然後將它移至最上層或最上層視窗的頂端。

如果最上層視窗重新置放到下層 (HWND_BOTTOM Z 順序的 ) , 或位於任何非最上層窗口之後,它就不再是最上層。 當最上層視窗成為非最上層時,其擁有者和擁有的視窗也會成為最上層的視窗。

非最上層視窗可以擁有最上層的視窗,但無法發生反向。 例如,任何視窗 (,最上層視窗所擁有的對話框) 本身都是最上層視窗,以確保所有擁有的視窗都維持在其擁有者上方。

如果應用程式不在前景,而且應該位於前景,則必須呼叫 SetForegroundWindow 函式。

若要使用 SetWindowPos 將視窗帶入頂端,擁有視窗的程式必須具有 SetForegroundWindow 許可權。

範例

如需範例,請參閱 初始化對話方塊

規格需求

需求
最低支援的用戶端 Windows 2000 專業版 [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限傳統型應用程式]
目標平台 Windows
標頭 winuser.h (包括 Windows.h)
程式庫 User32.lib
Dll User32.dll
API 集合 ext-ms-win-ntuser-window-l1-1-0 (於 Windows 8)

另請參閱

概念

MoveWindow

參考

SetActiveWindow

SetForegroundWindow

Windows