> ちょっと考えてみます.
前に
>Visible で Parent のないウィンドウを検出してやってみました.
と書いたのですが,Parent ではなく Owner を持たないウィンドウを
検出していましたが,これはなくてもいいようです.
少なくても私の環境では.
テストしたコードと図です.
図の TMemo はテストでハンドル名等を表示するために使用したものです.
下のコードでは,そのコードは削除しています.
動作確認環境は Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.
Opera と FireFox で動作することを確認しています.
IDE 上でコンパイルして実行しても,作成した EXE を起動しても,
位置とサイズが変更できることを確認しています.
//-----------------------------------------------------------------------------
// ウィンドウハンドルからウィンドウのクラス名を取得する関数
//-----------------------------------------------------------------------------
function GetWindowClassNameStr(hWindow: HWND): String;
var
Buffer : array[0..MAX_PATH-1] of Char;
Len : Integer;
begin
FillChar(Buffer, SizeOf(Buffer), #0);
Len := GetClassName(hWindow, Buffer, Length(Buffer));
if Len > 0 then Result := Buffer else Result := '';
end;
//-----------------------------------------------------------------------------
// アプリのウィンドウハンドルを取得するためのEnumWindowsのコールバック関数
// クラス名が目的の名前で,VisibleがTrueのウインドウのハンドルを求める
//-----------------------------------------------------------------------------
function EnumWindowsProc(hWindow: HWND; lp: LPARAM): BOOL; stdcall;
var
ClassName : String;
begin
Result := True;
ClassName := GetWindowClassNameStr(hWindow);
if UpperCase(ClassName) = UpperCase(Trim(Form1.Edit1.Text)) then begin
if IsWindowVisible(hWindow) then begin
LPDWORD(lp)^ := hWindow;
Result := False;
end;
end;
end;
//=============================================================================
// フォーム生成時の処理
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Lines.Clear;
Memo1.font.Name := 'MS ゴシック';
Memo1.Font.Size := 10;
Memo1.ScrollBars := ssVertical;
end;
//=============================================================================
// 指定クラス名のウィンドウの位置とサイズを変更してみる
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
hTargetWnd : HWND;
Flags : Cardinal;
begin
hTargetWnd := 0;
EnumWindows(@EnumWindowsProc, LPARAM(@hTargetWnd));
if hTargetWnd <> 0 then begin
Flags := SWP_NOZORDER or SWP_SHOWWINDOW;
SetWindowPos(hTargetWnd, 0, 0, 0, 500, 800, Flags);
end;
end;
|