トップへ(mam-mam.net/)

DelphiでSetWindowPosを使ったウィンドウ制御|Zオーダー・前面表示・SWPフラグ解説

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_BOTTOMZオーダーを最後面に設定します
HWND_TOPZオーダーを最前面に設定します
HWND_TOPMOSTZオーダーを常に最前面になるよう設定します
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_NOZORDERZオーダーは変更されない(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;