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
ウィンドウを 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

ウィンドウのサイズ設定とフラグの配置。 このパラメーターは、次の値と組み合わせて使用できます。

意味
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
現在の位置を保持します ( X および Y パラメーターは無視されます)。
SWP_NOOWNERZORDER
0x0200
Z オーダーでの所有者ウィンドウの位置は変更されません。
SWP_NOREDRAW
0x0008
変更を再描画しません。 このフラグが設定されている場合、いかなる種類の再描画も行われません。 これは、クライアント領域、クライアント以外の領域 (タイトル バーとスクロール バーを含む)、およびウィンドウの移動の結果として発見された親ウィンドウの任意の部分に適用されます。 このフラグが設定されている場合、アプリケーションは、再描画が必要なウィンドウと親ウィンドウの部分を明示的に無効化または再描画する必要があります。
SWP_NOREPOSITION
0x0200
SWP_NOOWNERZORDER フラグと同じです。
SWP_NOSENDCHANGING
0x0400
ウィンドウが WM_WINDOWPOSCHANGING メッセージを受信できないようにします。
SWP_NOSIZE
0x0001
現在のサイズを保持します ( cx パラメーターと cy パラメーターは無視されます)。
SWP_NOZORDER
0x0004
現在の Z 順序を保持します ( hWndInsertAfter パラメーターは 無視します)。
SWP_SHOWWINDOW
0x0040
ウィンドウが表示されます。

戻り値

型: BOOL

関数が成功すると、戻り値は 0 以外になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

Vista の再アーキテクチャの一環として、すべてのサービスが対話型デスクトップからセッション 0 に移動されました。 hwnd 操作とウィンドウ マネージャー操作はセッション内でのみ有効であり、hwnd を操作するセッション間の試行は失敗します。 詳細については、「 Windows Vista Developer Story: Application Compatibility Cookbook」を参照してください。

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 権限が必要です。

例については、「 ダイアログ ボックスの初期化」を参照してください。

要件

   
サポートされている最小のクライアント 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