DelphiでSetWindowPosを使ったウィンドウ制御|Zオーダー・前面表示・SWPフラグ解説
このページでは、DelphiでWindows APIのSetWindowPosを使ってウィンドウの表示順(Zオーダー)や位置・サイズを制御する方法を解説します。
前面表示(HWND_TOPMOST)、最背面配置(HWND_BOTTOM)、非アクティブ表示(SWP_NOACTIVATE)など、実用的なウィンドウ操作をサンプルコード付きで紹介。
各フラグの意味や使い分けも整理し、DelphiでのUI制御に役立つ知識をまとめています。
また、FindWindow によるウィンドウ ハンドルの取得方法も解説します。
SetWindowText、GetWindowTextによるウィンドウのタイトルバーのテキストの設定と取得も解説します。
SetWindowPos
ウィンドウのサイズ、位置、Zオーダーを変更するWindows API関数です。
SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; stdcall;
- hWnd
- 対象のウィンドウハンドル
- hWndInsertAfter
-
Z順に配置されたウィンドウの前にあるウィンドウへのハンドル、又は次のいずれかの値である必要があります。
値 意味 HWND_BOTTOM Zオーダーを最後面に設定します HWND_TOP Zオーダーを最前面に設定します HWND_TOPMOST Zオーダーを常に最前面になるよう設定します HWND_NOTOPMOST ウィンドウを常に最前面から解除し、通常のZオーダーに戻す(HWND_TOPMOSTの解除) - X
- クライアント座標でのウィンドウのX座標
- Y
- クライアント座標でのウィンドウのY座標
- cx
- ウィンドウの幅
- cy
- ウィンドウの高さ
- uFlags
-
ウィンドウのサイズ設定と配置フラグで、主に次の値を組み合わせて使用(主な値のみ)
値 意味 SWP_HIDEWINDOW ウィンドウを非表示にする SWP_SHOWWINDOW ウィンドウを表示する SWP_NOACTIVATE ウィンドウを表示・移動・サイズ変更してもアクティブにしない SWP_NOMOVE 現在位置を保持(X,Yパラメータは無視される) SWP_NOOWNERZORDER
又は
SWP_NOREPOSITIONウィンドウの所有関係(親子関係ではなく、オーナー関係)に基づく
Z オーダーの並びを変更しない
(ウィンドウのZオーダーを変更する際に、オーナーウィンドウの順序を維持)SWP_NOSIZE ウィンドウの大きさを変更しない(cx,cyパラメータは無視される) SWP_NOZORDER Zオーダーは変更されない(hWndInsertAfterパラメータは無視される)
SetForegroundWindow
指定したウィンドウを作成したスレッドをフォアグラウンドに移動し、ウィンドウをアクティブ(フォーカスされたキーボード入力等ができる状態)にします。
Zオーダーは変わりません。
SetForegroundWindow(hWnd: HWND): BOOL; stdcall;
- hWnd
- 対象のウィンドウハンドル
FindWindow
クラス名とウィンドウ名(又はどちらか)が指定した文字列と一致する最上位ウィンドウハンドルを取得します。
大文字と小文字は区別されません、また子ウィンドウを検索しません。
FindWindow(lpClassName, lpWindowName: LPCWSTR): HWND; stdcall;
- lpClassName
-
検索するウィンドウのクラス名
クラス名が分からない場合は フリーソフト Mam Spy-- などを使って調べる必要があります。
- lpWindowName
- 検索するウィンドウ名(ウィンドウのタイトルバーのテキスト)
SetWindowPosの使用例
ボタンを押すとZオーダーが常に最前面になります。
procedure TForm1.Button1Click(Sender: TObject); begin SetWindowPos(Self.Handle, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE or SWP_NOSIZE); end;
SetForegroundWindow、SetWindowPosの使用例
ウィンドウのZオーダーを最背面に設定し、フォアグラウンドでアクティブに設定する。
procedure TForm1.Button2Click(Sender: TObject); begin SetWindowPos(Self.Handle, HWND_BOTTOM, 0,0,0,0, SWP_NOMOVE or SWP_NOSIZE); SetForegroundWindow(Self.Handle); end;
メモ帳を起動し、メモ帳のウィンドウハンドルを探し、座標(0,0)に移動させ幅1000高さ500に設定しZオーダーを常に最前面に設定し、常に最前面を解除する。
procedure TForm1.Button2Click(Sender: TObject);
var h:THandle;
begin
//メモ帳を起動
ShellExecute(Self.Handle, nil, 'notepad.exe', nil, nil, SW_SHOW);
//起動に時間がかかる為、ウィンドウハンドルが取得できるまで待つ
h:=0;
while h=0 do
begin
//クラス「Notepad」のメモ帳のウィンドウを探す
h:=FindWindow('Notepad',nil);
Sleep(200);
end;
//
SetForegroundWindow(Self.Handle);
//メモ帳を座標(0,0)に移動させ幅1000高さ500に設定しZオーダーを常に最前面に設定
SetWindowPos(h, HWND_TOPMOST, 0,0, 1000,500, SWP_NOACTIVATE);
//メモ帳のZオーダーの常に最前面を解除
SetWindowPos(h, HWND_NOTOPMOST, 0,0, 0,0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
end;
SetWindowText
指定したウィンドウのタイトル バーのテキストを変更します
SetWindowText(hWnd: HWND; lpString: LPCWSTR): BOOL; stdcall; overload;
- hWnd
- 対象のウィンドウハンドル
- lpString
- タイトルまたはコントロール テキスト
GetWindowText
指定したウィンドウのタイトル バーのテキストを取得します
GetWindowText(hWnd: HWND; lpString: LPWSTR; nMaxCount: Integer): Integer; stdcall;
- hWnd
- 対象のウィンドウハンドル
- lpString
- テキストを受け取るバッファー
- nMaxCount
- バッファーにコピーする最大文字数(この数を超えると切り捨てられる)
SetWindowText、GetWindowTextの使用例
ウィンドウのタイトルバーのテキストを「こんにちは」に変更し、タイトルバーのテキストを取得します。
procedure TForm1.Button4Click(Sender: TObject); var ch:array[0..1023] of Char; begin SetWindowText(Self.Handle, 'こんにちは'); GetWindowText(Self.Handle, @ch[0], Length(ch) ); ShowMessage(ch); end;
