最大化ウインドウがあるか検出する
画面上に最大化されたウインドウが存在するか調べる関数を作ってみましょう。
最大化ウインドウを調べるには画面上にある全てのウインドウの状態を調べなければなりません。その為には EnumWindows APIを使用します。この関数はAPIヘルプにも解説があるように全てのトップレベルウィンドウを列挙する関数です。トップレベルウインドウとはDelphiでは TForm などに当たります。(フォーム上に張りつけたコントロールは子ウィンドウなので列挙の対象にはならない)
EnumWindows APIの第一引数にWindowsがウインドウを発見した時に呼び出すコールバック関数のアドレスを指定しなければなりません。この関数はクラスのメンバとして宣言した物は使えませんので注意が必要です。第二引数は「最大化ウインドウを調べる」だけなので必要としません。0を指定します。
ウインドウが最大化しているか調べるには GetWindowPlacement APIを使用し、引数として渡した TWINDOWPLACEMENT 構造体の showCmd フィールドを調べます。この値が SW_MAXIMIZE であればそのウインドウは最大化しています。

では実際にコードを書いてみます。

interface

uses
  Windows;

  function CheckMaxWindow: Boolean;

implementation

var
  FirstWindow: THandle;
  MaxWindow: Boolean;

function MyCallBackProc(hWindow:HWND; lParam:LongInt):BOOL; stdcall;
//EnumWindowsのコールバック関数------------------------------------------------
var
  pw : TWINDOWPLACEMENT;
begin
  if FirstWindow = 0 then
    FirstWindow := hWindow
  else
    if FirstWindow = hWindow then
    begin
    { 始めに検出したウインドウと同じウインドウなので }
    { 完全に一回りしたと判断して列挙を中断させる     }
      Result := False;
      Exit;
    end;
  pw.length := SizeOf(TWINDOWPLACEMENT);
  GetWindowPlacement(hWindow, @pw);
  if pw.showCmd = SW_MAXIMIZE then
  begin
  //最大化ウインドウを発見した
    Result := False;//戻り値をFalseにして列挙中断
    MaxWindow := True;
  end else
    Result:= True;
end;

function CheckMaxWindow: Boolean;
//最大化ウインドウがあればTrueを返す関数---------------------------------------
begin
  //グローバル変数の初期化
  FirstWindow := 0;
  MaxWindow   := False;
  while EnumWindows(@MyCallBackProc, 0) do
  begin
  //中身が空のループ
  end;
  Result := MaxWindow;
end;

もうお気づきかと思いますが、この関数では画面全てを覆っているかどうかを調べていません。純粋に最大化されているウインドウのみを検出しています。

Back    Prev