IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> GetWindowText
Unconnected
сообщение 7.08.2010 19:34
Сообщение #1


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Привет, ещё раз) Никак мне апи с первого разу не даётся.

Вопрос в следующем. На формах приложений, как принято, лежат компоненты, их можно посмотреть например прогой Spy++ (наводишь прицел и отображается, что это). А некоторых приложениях этим прицелом отдельные поля и кнопки обнаружить нельзя, они там идут как бы "блоками", то есть, например, несколько кнопок, эдитов, чек-боксов объединены в один внутрипрограммный класс. И по отдельности они не определяются. Вопрос, возможно ли вытащить допустим текст из текстового поля, который является частью экземпляра такого класса? Сработает ли здесь GetWindowText? Я пытался вытащить все надписи с компонентов формы с помощью EnumChildWindows, и, вот, столкнулся..


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 7.08.2010 22:47
Сообщение #2


Гость






Вот в этом и твоя ошибка. Кто ж перечисляет все компоненты? А если у тебя окно на чистом API, что будет? Неужели тоже будут найдены компоненты? smile.gif

"Все проще гораздо" (С) Ирония судьбы
Проходишь по всем элементам одного уровня, используя GetNextWindow + GW_HWNDNEXT, а для вложенных - используешь GetWindow + GW_CHILD и рекурсию:

procedure TForm1.Build_Tree(Node: TTreeNode; myHandle: HWND; myLevel: Integer);
var
szClassName, szCaption: array[0..MAXCHAR - 1] of Char;
s: string;

begin
while myHandle <> 0 do begin
GetClassName(myHandle, szClassName, MAXCHAR);
GetWindowText(myHandle, szCaption, MAXCHAR);
s := Format('%s Caption = %s, Handle = %d',
[String(szClassName), String(szCaption), myHandle]);

Build_Tree(TreeView1.Items.AddChild(Node, s),
GetWindow(myHandle, GW_CHILD), myLevel + 1); // Вот она - рекурсия !!!

myHandle := GetNextWindow(myHandle, GW_HWNDNEXT);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var h: HWND;
begin
h := FindWindow(nil, 'Form1');
if h <> 0 then
begin
Build_Tree(nil, GetWindow(h, GW_CHILD), 0);
end
else ShowMessage('Cannot find window');
end;
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.07.2025 22:59
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"