0

関数 EnumWindows および EnumChildWindows を使用して、Delphi で記述された実行中のアプリケーションのウィンドウを検査する Delphi XE2 でアプリケーションを開発しています。

これはメインのコードです (例から適応: http://www.swissdelphicenter.ch/torry/showcode.php?id=410 )

function EnumChildWindowsProc(Wnd: HWnd; Form: TForm1): Bool; export;
  {$ifdef Win32} stdcall; {$endif}
var
  Buffer: array[0..99] of Char;
begin
  GetWindowText(Wnd, Buffer, 100);

  if StrPas(Buffer) = '' then Buffer := 'Empty';
  new(AWindows);
  with AWindows^ do
  begin
    WindowHandle := Wnd;
    WindowText   := StrPas(Buffer);
  end;

  CNode := Form1.TreeView1.Items.AddChildObject(PNode,
               AWindows^.WindowText + ':' +
               IntToHex(AWindows^.WindowHandle, 8), AWindows);

  if GetWindow(Wnd, GW_CHILD) = 0 then
  begin
    PNode := CNode;
    Enumchildwindows(Wnd, @EnumChildWindowsProc, 0);
  end;
  Result := True;
end;

function EnumWindowsProc(Wnd: HWnd; Form: TForm1): Bool;
  export; {$ifdef Win32} stdcall; {$endif}
var
  Buffer: array[0..99] of Char;
begin
  GetWindowText(Wnd, Buffer, 100);

  if StrPas(Buffer) = '' then Buffer := 'Empty';
  new(AWindows);
  with AWindows^ do
  begin
    WindowHandle := Wnd;
    WindowText   := StrPas(Buffer);
  end;

  if Pos(Form1.edAppToFind.Text,AWindows^.WindowText) > 0 then // <- inspect child only for my Application
  begin
    PNode := Form1.TreeView1.Items.AddObject(nil, AWindows^.WindowText + ':' +
      IntToHex(AWindows^.WindowHandle, 8), AWindows);
    EnumChildWindows(Wnd, @EnumChildWindowsProc, 0);
  end;
  Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumWindows(@EnumWindowsProc, self.Handle);
end;

再帰が停止した後のオブジェクト TGroupBox を除いて、すべてがうまく機能します。ただし、コントロール TGroupBox には他の要素 (TLabel) が含まれています。

実際、フォームに TGroupBox を含め、次に TGroupBox に TLabel を含めて Delphi で単純なアプリケーションを作成したとしても、アプリケーションを起動して Spy++ (またはツール Autoit AU3Info) で検査しても、TGroupBox に入ることができません。内部の TLabel は検査されません。

TGroupBox 内で TLabel コントロールを見つける方法はありますか?

4

1 に答える 1