Delphi проверяет внешние TLabels внутри TGroupBox через EnumWindows, Enumchildwindows или Spy++
Я разрабатываю приложение в Delphi XE2, которое через функции EnumWindows и EnumChildWindows проверяет окно работающего приложения, также написанного на Delphi.
Это основной код (адаптированный на примере: 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).
Фактически, даже написав простое приложение на Delphi, включив в форму TGroupBox, а затем в TGroupBox TLabel, запустив приложение и проверив его с помощью Spy++ (или с помощью инструмента Autoit AU3Info), вы не можете войти в TGroupBox: TLabel внутри не проверяется.
Есть ли способ найти элемент управления TLabel в TGroupBox?
1 ответ
Это не проблема с элементом управления групповым блоком. Проблема в том, что TLabel
управление не оконное. Нет никакого дескриптора окна, связанного с этим, и поэтому он не может быть найден Spy++, EnumChildWindows
и т.п.