他のアプリのウィンドウサイズの取得および変更をするには?
多分APIを使うのだと思うのですが、わかりません。
> 他のアプリのウィンドウサイズの取得および変更をするには?
目標のウィンドウのハンドルを取得して、サイズは 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;
とします。
ありがとうございます。これで通常時のフォームサイズは変更できます。
ところで、フォームが最大化されている他のアプリのサイズは、変更(最大時のサイズ)できるのでしょうか?
> ところで、フォームが最大化されている他のアプリのサイズは、変更(最大時のサイズ)できるのでしょうか?
ウィンドウが最大化されているかどうかは 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;
蛇足ですが
if IsZoomed(hMemochou) then
のところを
if IsZoomed(hMemochou) or IsIconic(hMemochou) then
とするとアイコン化されているときも判断できます。
あっ、
>変更(最大時のサイズ)できるのでしょうか?
最大時のサイズはウィンドウズが決めているのでできません。そういうウィンドウ
を見たことありますか?
あるホームページで下記のサンプルがありました。
---------------------------------------------------------------------
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のみの機能ですか?
> これは、Delphiのみの機能ですか?
いいえ、WM_GETMINMAXINFO に応答したプログラムですから、Windows 共通の
プログラムだと思います。この機能を外部から行うためには、本来そのウィンドウ
に送られるメッセージを横取りして、それに成り代わって上のような応答をしな
ければなりません。これは、今そこにあるウィンドウのサイズを変更するのとは
全くべつの機能です。多分グローバルフックというのを使うんだと思いますが
わたしはやったことがありません。
わかりました。ちょっとフックの勉強をしてみます。jokさん。ありがとうございました。
もし、他の人でこの方法がわかる人がいれば、書き込みのほう、お願いします。
ありがとうございました(^_^)
ツイート | ![]() |