他のアプリのウィンドウサイズの取得および変更をするには?

解決


たか  2004-06-19 22:49:15  No: 9516

他のアプリのウィンドウサイズの取得および変更をするには?
多分APIを使うのだと思うのですが、わかりません。


jok  2004-06-20 03:58:45  No: 9517

> 他のアプリのウィンドウサイズの取得および変更をするには?

目標のウィンドウのハンドルを取得して、サイズは GetWindowRect() で取得
変更は SetWindowPos() を使います。

例えば、あらかじめメモ帳を起動しておいて、そのサイズを取得するには

procedure TForm1.Button1Click(Sender: TObject);
var
  hMemochou:HWND;
  r:TRect;
begin
  hMemochou := FindWindow('Notepad',nil);
  if hMemochou <> 0 then begin
    GetWindowRect(hMemochou,r);
    Label1.Caption := 'Width = '+IntToStr(r.Right-r.Left);
    Label2.Caption := 'Height = '+IntToStr(r.Bottom-r.Top);
  end;
end;

サイズを 300,300 に設定するには

procedure TForm1.Button2Click(Sender: TObject);
var
  hMemochou:HWND;
  r:TRect;
begin
  hMemochou := FindWindow('Notepad',nil);
  if hMemochou <> 0 then
    SetWindowPos(hMemochou,0,0,0,300,300,SWP_NOMOVE or SWP_NOZORDER);
end;

とします。


たか  2004-06-20 23:46:04  No: 9518

ありがとうございます。これで通常時のフォームサイズは変更できます。
ところで、フォームが最大化されている他のアプリのサイズは、変更(最大時のサイズ)できるのでしょうか?


jok  2004-06-21 03:37:42  No: 9519

> ところで、フォームが最大化されている他のアプリのサイズは、変更(最大時のサイズ)できるのでしょうか?

ウィンドウが最大化されているかどうかは IsZoomed() で判断できます。また、
元のサイズにもどすには、

SendMessage(hMemochou,WM_SYSCOMMAND,SC_RESTORE,0);

のようにします。

procedure TForm1.Button1Click(Sender: TObject);
var
  hMemochou:HWND;
  r:TRect;
begin
  hMemochou := FindWindow('Notepad',nil);
  if hMemochou <> 0 then begin
    if IsZoomed(hMemochou) then
      SendMessage(hMemochou,WM_SYSCOMMAND,SC_RESTORE,0);
    GetWindowRect(hMemochou,r);
    Label1.Caption := 'Width = '+IntToStr(r.Right-r.Left);
    Label2.Caption := 'Height = '+IntToStr(r.Bottom-r.Top);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  hMemochou:HWND;
begin
  hMemochou := FindWindow('Notepad',nil);
  if hMemochou <> 0 then
    if IsZoomed(hMemochou) then
      SendMessage(hMemochou,WM_SYSCOMMAND,SC_RESTORE,0);
    SetWindowPos(hMemochou,0,0,0,300,300,SWP_NOMOVE or SWP_NOZORDER);
end;


jok  2004-06-21 03:39:46  No: 9520

蛇足ですが

if IsZoomed(hMemochou) then

のところを

if IsZoomed(hMemochou) or IsIconic(hMemochou) then

とするとアイコン化されているときも判断できます。


jok  2004-06-21 03:41:41  No: 9521

あっ、

>変更(最大時のサイズ)できるのでしょうか?

最大時のサイズはウィンドウズが決めているのでできません。そういうウィンドウ
を見たことありますか?


たか  2004-06-21 06:42:58  No: 9522

あるホームページで下記のサンプルがありました。
---------------------------------------------------------------------
private
  procedure GetMinMaxInfo(var msg : TWMGetMinMaxInfo);
                          message WM_GETMINMAXINFO;
     .
     .
     .
procedure TMainForm.GetMinMaxInfo(var msg : TWMGetMinMaxInfo);
begin
  //最大化サイズ
  Msg.MinMaxInfo.ptMaxSize.x:=300;
  Msg.MinMaxInfo.ptMaxSize.y:=250;
  //最大化の時のポジション (画面中央)
  Msg.MinMaxInfo.ptMaxPosition.x:=(Screen.Width - Msg.MinMaxInfo.ptMaxSize.x) div 2;
  Msg.MinMaxInfo.ptMaxPosition.y:=(Screen.Height -  Msg.MinMaxInfo.ptMaxSize.y) div 2;
  //最小サイズ
  Msg.MinMaxInfo.ptMinTrackSize.x:=100;
  Msg.MinMaxInfo.ptMinTrackSize.y:=100;
  //最大サイズ
  Msg.MinMaxInfo.ptMaxTrackSize.x:=300;
  Msg.MinMaxInfo.ptMaxTrackSize.y:=250;
  //こうやってダラダラ書くより With を使った方がいいよ。
end;
---------------------------------------------------------------------
これを実行すると、本プログラムのフォームは、たしかに最大化ボタンを押すと、サイズが変更されています。
これは、Delphiのみの機能ですか?


jok  2004-06-21 07:30:31  No: 9523

> これは、Delphiのみの機能ですか?

いいえ、WM_GETMINMAXINFO に応答したプログラムですから、Windows 共通の
プログラムだと思います。この機能を外部から行うためには、本来そのウィンドウ
に送られるメッセージを横取りして、それに成り代わって上のような応答をしな
ければなりません。これは、今そこにあるウィンドウのサイズを変更するのとは
全くべつの機能です。多分グローバルフックというのを使うんだと思いますが
わたしはやったことがありません。


たか  2004-06-21 09:51:06  No: 9524

わかりました。ちょっとフックの勉強をしてみます。jokさん。ありがとうございました。
もし、他の人でこの方法がわかる人がいれば、書き込みのほう、お願いします。


たか  2004-06-21 10:21:12  No: 9525

ありがとうございました(^_^)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加