AsuYuHomepage
トップページ サイトの説明 子供の成長記録 JM BAR Delphi リンク集
Home>>プログラミング>>Tips&Tricks>>自アプリ以外のウィンドウを操作する
Delphi Tips
Delphi Win32API
ダウンロード

Counter

Delphi Tips & Tricks

自アプリ以外のウィンドウを操作する

 自分のアプリ以外のウィンドウを操作するには、DelphiのVCLではなく生のWinAPIを使いウィンドウハンドルを使って操作することになると思います。
ここでは簡単な例として、Windowsの電卓を操作してみます。動作の感じをわかってもらえればいいかなと思っています。
 ウィンドウ関連のAPIは当サイトのWin32APIのページのウィンドウ関連で数種紹介しています。
privart
  hcal :HWND;

--------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
  //操作対象として電卓を起動
  ShellExecute(Handle, 'OPEN', 'C:\WINDOWS\System32\calc.exe',
               nil, nil, SW_NORMAL);
  Sleep(1000);
  //電卓のウィンドウハンドルを取得
  hcal :=FindWindow(nil, '電卓');
  if hcal =0 then 
    ShowMessage('Error!');
end;

//電卓が起動していればメッセージを送って終了させる
procedure TForm1.FormDestroy(Sender: TObject);
begin
  if hcal <> 0 then
    SendMessage(hcal, WM_CLOSE, 0, 0);
end;

//-----------電卓をプログラムで操作--------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
  //最大化する
  ShowWindow(hcal, SW_MAXIMIZE);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  h5 :HWND;
begin
  //「5」のボタンのハンドルを取得し擬似的に押す
  h5 :=FindWindowEx(hcal, 0, nil, '5');
  if h5 <> 0 then
  begin
    SendMessage(h5, WM_LBUTTONDOWN, 0, 0);
    Sleep(100);
    SendMessage(h5, WM_LBUTTONUP, 0, 0);
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  hBack :HWND;
  R     :TRect;
begin
  //意味はないですが押すたびに「Back」ボタンを大きくします
  hBack :=FindWindowEx(hcal, 0, nil, 'Back');
  if hBack <> 0 then
  begin
    Windows.GetClientrect(hBack, R);
    SetWindowPos(hBack, 0, 0, 0, R.Right -R.Left +5, R.Bottom -R.Top +5,
                 SWP_NOMOVE or SWP_NOZORDER);
  end;
end;

他のウィンドウを操作するには、WinAPIを使って操作したいウィンドウのハンドルを取得する必要があります。方法はたくさんあるのですが、今回はウィンドウのテキスト(親ウィンドウではタイトルバーの文字列、ボタンなどの子ウィンドウではCaptionなど)からウィンドウハンドルを取得する「FindWindow関数」を使いました。
 ウィンドウハンドルの取得に成功したら、APIを使うことでそのウィンドウに対してほとんどのことはできます。上のサンプルでは、通常はタイトルバーに最大化のシステムメニューがない「電卓」を最大化したり、子ウィンドウであるボタンのハンドルを取得して、ウィンドウメッセージを送ることで擬似的に押したりしています。

1