喫茶XRAYトップページ

[スレッド全体
]

[8349] Re11:Delphi2010とDelphiXEとの違い返信 削除
2014/12/30 (火) 21:28:13 Mr.XRAY
> ちょっと考えてみます.

前に
>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;



[8350] Re12:Delphi2010とDelphiXEとの違い返信 削除
2014/12/30 (火) 21:42:48 Mr.XRAY
> IDE 上でコンパイルして実行しても,作成した EXE を起動しても,
> 位置とサイズが変更できることを確認しています.


Opera も FireFox も「管理者として実行」した場合は,
テストプログラムも「管理者として実行」が必要です.


[8355] Re13:Delphi2010とDelphiXEとの違い返信 削除
2014/12/31 (水) 09:30:01 TS
▼ Mr.XRAYさん

お世話になります。私のお間抜けな質問でまた1つ有用なコードが
使用させて貰えてうれしいです。

お間抜けな結論は私がDelphiを起動するのに「管理者として実行」して
いなかったからです。

「Delphi2010とDelphiXEとの違い」はなかったが結論です。

Mr.XRAYさんの
Windows Vista 以降の OS で Delphi
http://mrxray.on.coocan.jp/Delphi/Others/WindowsVista.htm

の記事で
procedure TForm1.FormShow(Sender: TObject);
begin
//IsUserAnAdminの使用には,usesにShlObjが必要
  if IsUserAnAdmin then begin
    showmessage('管理者権限で実行中');
  end else begin
    showmessage('管理者権限以外で実行中');
  end;
end;
でテストして初めて気づきました。

Delphiを起動するのに「管理者として実行」しなければ
作成中のプログラムも「管理者として実行」しないと言う事でした。

これに懲りられず、また来年もよろしくお願いします。


[8356] Re14:Delphi2010とDelphiXEとの違い返信 削除
2014/12/31 (水) 09:54:24 Mr.XRAY
▼ TSさん.どうもです.

> これに懲りられず、また来年もよろしくお願いします。

いやいや,ちょっと嬉しいです.

(1) 当サイトの記事が役にたったらしい
(2) TS さんレベルの方でも,Vista以降への移行で苦労することがある

なんと言っても「人の不幸は蜜の味」ですから.
ゴメンなさい (^^;
また来年もよろしくお願いします.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82