Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Нахождения компонентов другой программы


Автор: chiffa 4.7.2011, 10:34
Всем добрый день. Стоит задача получить информацию из определенных полей сторонней программы. Столкнулся с двумя основными проблемами.
1. Spy++ исследовал программу, получить такую структуру:
Код

-TMain
 -TPanel
  -TPageControl
   ...
      -TShape
      -TShape
      -TShape
       -TRichEdit


Перебираю элементы:

Код

H1 := FindWindow ('TMain', nil);
H2 := FindWindowEx(H1, 0, 'TPanel', nil);
H3 := FindWindowEx(H2, 0, 'TPageControl', nil);
....
H7 := FindWindowEx(H5, 0, 'TShape', nil);

и основная проблема: как обратиться к третьему элементу TShape т.к. именно в нем находится нужный мне TRichEdit.

И 2я непонятка. Программа находит и определяем хендлы, только когда приложение активно (то есть моя программка находится над ним), если же приложение в котором ведется поиск не активно или свернуто, почему то ничего не находит...

Буду признателен за подсказки и помощь! Заранее всем спасибо!

Автор: Keeper89 4.7.2011, 16:33
Что за программа?

Автор: chiffa 4.7.2011, 17:25
Самописная (не мною)...

Автор: Keeper89 4.7.2011, 21:24
Пощупать где можно взять?

Автор: chiffa 4.7.2011, 22:10
к сожалению это нереально :( а универсального способа пройтись по всем компонентам нельзя?...

Автор: Keeper89 5.7.2011, 00:49
Ну чем то вкладки отличаются?

Автор: northener 5.7.2011, 02:18
Цитата(Keeper89 @  5.7.2011,  00:49 Найти цитируемый пост)
Ну чем то вкладки отличаются? 

А при чём тут вкладки?
Автору нужно на "какой-то вкладке" обнаружить некий "третий элемент TShape", который как автору показывает Spy++, является Parent'ом для какого-то "элемента TRichEdit".
Вкладки он находит, судя по всему. Но вот "третий элемент" ему найти не удаётся. 
Не Брюс он Уиллис!smile

Автор: Keeper89 5.7.2011, 02:39
Цитата(northener @  5.7.2011,  02:18 Найти цитируемый пост)
А при чём тут вкладки?

Ну так сначала надо вкладку определить или я не прав?

Автор: northener 5.7.2011, 03:27
Цитата(Keeper89 @  5.7.2011,  02:39 Найти цитируемый пост)
Ну так сначала надо вкладку определить или я не прав?

Прав. Конечно прав.

Только автору это не поможет. (((
Даже если он эту вкладку найдёт.

Чем-то всё это мне напоминает знаменитое "угадал все буквы, не смог угадать слово".

Автор: bems 5.7.2011, 09:46

M
bems
chiffa, не путай кнопку Report с кнопкой ответа

Автор: chiffa 5.7.2011, 09:51
Вкладки то я как раз нахожу, нормально, и первый TShape нахожу, а вот как обратится к третьему TShape - не знаю...

Добавлено через 5 минут и 43 секунды
Цитата(bems @  5.7.2011,  09:46 Найти цитируемый пост)

bems    chiffa, не путай кнопку Report с кнопкой ответа


Сорри... Я вообщем не путаю... инет просто лагает дико и стили посьезжали крайне трудно ориентироваться на странице... еще раз сорри...

Автор: Keeper89 5.7.2011, 10:23
Вкладку определил, ок. В каждом шейпе есть РичЕдит? Если нет - то перебери все и как только встретишь один с РичЕдитом, его и бери.

Автор: chiffa 5.7.2011, 11:01
ЭТо то я понимаю.. Но как их перебрать?... можно пример кода?

Автор: Keeper89 5.7.2011, 11:56
Через EnumWindows.

Где-то в этих темах я приводил пример:
http://forum.vingrad.ru/forum/topic-265526/hl/findwindow/index.html
http://forum.vingrad.ru/forum/topic-261954/hl/findwindow/index.html

Автор: chiffa 5.7.2011, 12:42
Спасибо за ссылки, но что то я там не нашел там примеров с EnumWindows... Если не затруднит можешь скопировать сюда?....

Автор: Keeper89 5.7.2011, 13:01
Пройдись еще раз, должны быть

Автор: Dik0n 5.7.2011, 14:12
Народ Вы о чем, TShape это графический элемент он не имеет Handle и на нем нельзя размещять компоненты и EnumWindows тут не поможет.
искать надо примерно так, хватит и одной переменной
Код

H1 := FindWindow ('TMain', nil);
H1 := FindWindowEx(H1, 0, 'TPanel', nil);
H1 := FindWindowEx(H1, 0, 'TPageControl', nil);
....
H1 := FindWindowEx(H1, 0, 'TRichEdit', nil);

Автор: Rrader 5.7.2011, 14:22
Dik0n, раз у ТС речь идёт о Spy++, то это получается нестандартный TShape с хэндлом.

По теме:
Код

H7 := FindWindowEx(H5, 0, 'TShape', nil);
// Следующий TShape
H7 := GetWindow(H7, GW_HWNDNEXT);
// Следующий TShape
H7 := GetWindow(H7, GW_HWNDNEXT);
// Теперь ищем RichEdit...

Автор: Dik0n 5.7.2011, 15:01
Цитата(Rrader @  5.7.2011,  14:22 Найти цитируемый пост)
Dik0n, раз у ТС речь идёт о Spy++, то это получается нестандартный TShape с хэндлом

У этого компонента нет Handle вообще!!! смотрим, наследуется от TGraphicControl
Код

  TShape = class(TGraphicControl)
  private
    FPen: TPen;
    FBrush: TBrush;
    FShape: TShapeType;
    procedure SetBrush(Value: TBrush);
    procedure SetPen(Value: TPen);
    procedure SetShape(Value: TShapeType);
  protected
    procedure Paint; override;


Код

  TGraphicControl = class(TControl)
  private
    FCanvas: TCanvas;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  protected
    procedure Paint; virtual;
    property Canvas: TCanvas read FCanvas;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

Автор: chiffa 5.7.2011, 15:02
Спасибо всем! То что нужно! А насчет того что находит только когда окно активно?... Какие могут быть варианты?...

Автор: Keeper89 5.7.2011, 15:44
Dik0n, Rrader сказал правильно, значит он не обычный smile 

Автор: Dik0n 5.7.2011, 16:21
Keeper89, Вы не поняли, у chiffa уже все прекрасно работает, ньюанс в том, если окно свернуто, то функции по поиску окна не работают...

Автор: chiffa 5.7.2011, 16:47
да именно так... непонятно только почему....

Автор: Rrader 5.7.2011, 17:22
Какой хэндл не находится, когда программа свернута?

Автор: chiffa 5.7.2011, 17:42
TPageControl....

Автор: chiffa 5.7.2011, 18:00
Ошибка найдена... формы с заглавным именем класса TfrmMain запущено несколько, поэтому оно и не подхватывает ту которая активна, если не активны все, то хрен знает по какому принципу оно определяет первую форму...

Отсюда вопрос: как задать именно нужную мне окно (кроме как прописать тайтл)?...

Автор: Rrader 6.7.2011, 05:16
Тогда скажи нам, есть ли у нужной формы какие-нибудь уникальные признаки?

Автор: chiffa 6.7.2011, 08:36
А что значит уникальные признаки?Я всегда считал что уникальный признак это Имя класса и заголовок, как показала практика я ошибался...

Перебирать все компоненты со всех форм и сравнивать с заранее заданной структурой - иррационально... 

Автор: Rennigth 7.7.2011, 10:15
Цитата(chiffa @  6.7.2011,  08:36 Найти цитируемый пост)
Перебирать все компоненты со всех форм и сравнивать с заранее заданной структурой - иррационально...  

Ну почему иррационально(чего в жизни иногда не зделаешь ради победы  smile ), а вообще как я понимаю формы то у тебя не одинаковые, так значит у них и класс окна разный  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)