Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибка рекурсии при переборе элементов TGroupBox в Delphi XE2

Delphi , Компоненты и Классы , TLabel

В статье рассматривается проблема рекурсии при переборе элементов TGroupBox в Delphi XE2. При использовании функций EnumWindows и EnumChildWindows для просмотра окон запущенного приложения, также написанного на Delphi, обнаруживается, что рекурсия останавливается после объекта TGroupBox, хотя внутри него находятся другие элементы, такие как TLabel.

Причина этой проблемы заключается в том, что TLabel не является окном и не имеет связанного с ним оконного хэндла. Поэтому внешние инструменты, основанные на EnumChildWindows (например, AutoIt и Spy++), не могут найти его. Стандартный способ экспонирования пользовательского интерфейса для автоматизации - это интерфейс автоматизации. Текущий стандарт - UIAutomation.

Если необходимо просмотреть третье-party приложение, содержащее простые TLabel, и нет доступа к его интерфейсу автоматизации, то чтение текста на нем с помощью EnumWindow или EnumChildwindow, скорее всего, невозможно. В этом случае единственным вариантом может быть обращение к поставщику для получения доступа к интерфейсу автоматизации.

Пример кода на Object Pascal (Delphi) для перечисления окон запущенного приложения:

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 в Delphi XE2, когда функция EnumWindows и EnumChildWindows останавливаются на объекте TGroupBox, не видя вложенные элементы, такие как TLabel, из-за отсутствия у них оконного хэнд


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TLabel ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-22 09:42:05/0.005573034286499/1