Привет, ещё раз) Никак мне апи с первого разу не даётся.
Вопрос в следующем. На формах приложений, как принято, лежат компоненты, их можно посмотреть например прогой Spy++ (наводишь прицел и отображается, что это). А некоторых приложениях этим прицелом отдельные поля и кнопки обнаружить нельзя, они там идут как бы "блоками", то есть, например, несколько кнопок, эдитов, чек-боксов объединены в один внутрипрограммный класс. И по отдельности они не определяются. Вопрос, возможно ли вытащить допустим текст из текстового поля, который является частью экземпляра такого класса? Сработает ли здесь GetWindowText? Я пытался вытащить все надписи с компонентов формы с помощью EnumChildWindows, и, вот, столкнулся..
Вот, что то такое:
Вот в этом и твоя ошибка. Кто ж перечисляет все компоненты? А если у тебя окно на чистом API, что будет? Неужели тоже будут найдены компоненты?
"Все проще гораздо" (С) Ирония судьбы
Проходишь по всем элементам одного уровня, используя 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;
Хмм.. натравил я сейчас код на свою Мозиллу, а он что-то ни заголовки вкладок не показал, ни кнопок, ни строки адресной.. Может, это не вложенные (дочерние) элементы, а цельные компоненты?
Хитрый, да? Мозилла не показывает свои заголовки. Об нее уже столько копий сломано, на многих форумах поднимались темы, не удается получить заголовки вкладок/адресных строк
Интересно. Надежно её защитили от вторжений, наверное) Ну, один заголовок она всё же показывает..
Спасибо за помощь
Хочу. Странно, winapi вроде один на всех, ан нет, не для всех законы писаны.
Можно и противоядие, в комплект)
Противоядия не существует. Вернее, оно настолько сложное, что связываться с этим не надо.
А рецепт - очень простой: GetWindowText "берет" только то, что установлено через SetWindowText (дельфийское component.caption := 'что-то там' тоже работает подобным образом). А ты не устанавливай через SetWindowText. Рисуй текст на контроле вручную: http://msdn.microsoft.com/en-us/library/ms901121.aspx в помощь. Тогда твои заголовки тоже не будут читаться через GetWindowText.
Значит, там рисованное всё.. Прикольно, при вводе текста в адресную строку каждый символ наверное удаляется и перерисовывается ) Наверное, им сложнее внутри программы брать caption-ы, нарисованный-то не так просто взять.
О содержимом адресной строки почти в любом браузере можно догадаться по его заголовку. А подменить - просто отрисовать поверх настоящего эдита - поддельный, с нужным адресом... На правах мыслей вслух)