Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 954

/ вопрос закрыт /

Здравствуйте, уважаемые эксперты!
Возникла проблема при использовании функции FindWindowEx.
Моя программа является браузером(интернет браузером), я получаю хендл браузера вот так:

h:=WebBrowser1.Handle;

На этом этапе всё нормально, но когда я пытаюсь спуститься на уровень ниже(в WebBrowser1) вот так:

z:=Edit1.Text; //здесь я ввожу названия кнопок
h:=WebBrowser1.Handle;
k:= FindWindowEx(h,0,nil,'z');

и превратить хендл браузера в родительский чтоб в нём искать дочерние, функция FindWindowEx возвращает нули.
Что это за напасть и как с ней бороться???


Спасибо за внимание.

QWERYTY Вопрос закрыт (ответы не принимаются, мини-форум закрыт)

Вопрос задал: QWERYTY (статус: Посетитель)
Вопрос отправлен: 31 марта 2010, 06:10
Состояние вопроса: закрыт, ответов: 1.

Ответ #1. Отвечает эксперт: Паровоз

Здравствуйте, Никоноров К.С.!
Попробуйте этот код:

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('www.yandex.ru');
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  v:OleVariant;
  i: integer;
begin
  v := Webbrowser1.Oleobject.Document.Forms.Item(0).Elements;
  for i := 0 to (v.Length - 1) do
    if (CompareText(v.Item(i).TagName,'INPUT') = 0)and
       (CompareText(v.Item(i).Type,'TEXT') = 0)
    then v.Item(i).Value := 'Объектная модель IE и Delphi';
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var
  v:OleVariant;
  i: integer;
begin
  v := Webbrowser1.Oleobject.Document.Forms.Item(0).Elements;
  for i := 0 to (v.Length - 1) do
    if (CompareText(v.Item(i).TagName, 'INPUT') = 0) and
       (CompareText(v.Item(i).Type, 'SUBMIT') = 0) and
       (v.Item(i).Value = 'Найти')
    then v.Item(i).Click;
end;

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 31 марта 2010, 20:26
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 12; последнее сообщение — 31 марта 2010, 22:04; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 31 марта 2010, 08:24 [#1]:

k:= FindWindowEx(h,0,nil,'z'); // <--- имя переменной в кавычках - очень оригинально!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Паровоз

Паровоз (статус: 10-ый класс), 31 марта 2010, 10:52 [#2]:

Скорее всего никаих хендлов Вы не найдете, так как обычно все эти кнопки нарисованы. Доступ к ним может быть только через объектную модель Internet Explorer.
Вадим К

Вадим К (статус: Академик), 31 марта 2010, 11:12 [#3]:

Можно легко проверить, есть ли там хендлы или всё это иллюзия, а не кнопки. В поставке VisualStudio есть приложения Spy++. Оно позволяет подсмотреть всю иерархию.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 31 марта 2010, 11:41 [#4]:

Цитата (Вадим К):

В поставке VisualStudio есть приложения Spy++. Оно позволяет подсмотреть всю иерархию.

Да таких программ - вагон и маленькая тележка.
Например WindowFinder - крохотная (~50 кб) программулина, с исходниками. Могу прислать.

Дай URL какуой-нить страницы с кнопками, я попробую её просканировать в IE на предмет хэндлов на кнопках.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Паровоз

Паровоз (статус: 10-ый класс), 31 марта 2010, 11:47 [#5]:

"Дай URL какуой-нить страницы с кнопками, я попробую её просканировать в IE на предмет хэндлов на кнопках."

https://expert.delphi-int.ru/question/3954/
min@y™

min@y™ (статус: Доктор наук), 31 марта 2010, 13:55 [#6]:

На этой странице, загруженной в IE, WindowFinder кнопок не нашёл. На google.ru - тоже.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
QWERYTY

QWERYTY (статус: Посетитель), 31 марта 2010, 18:48 [#7]:

Насчёт переменной в кавычках вы правы, наверное не очень полезно писать проги в пять часов утра.
WindowFinder я не скачал(где пишут что платная, где по ссылке не переходит), но использовал WndInfo. Есть подозрения что это очень похожие вещи. Дело в том что WndInfo показывает один хендл куда бы я не наводил курсор(в пределах WebBrowser1 разумеется). Вот я и пытаюсь по тойже логике найти дочерние в WebBrowser1 указав его хендл как родительский, а по названиям кнопок найти их хендлы.
На самой проге всё работает(по крайней мере показания совпадают с WndInfo).
В чём принципиальная разница между окном браузера и окном программы на уровне хендлов??? Может там названия кнопок не такие как кажется???
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
min@y™

min@y™ (статус: Доктор наук), 31 марта 2010, 19:02 [#8]:

Цитата (QWERYTY):

Дело в том что WndInfo показывает один хендл куда бы я не наводил курсор(в пределах WebBrowser1 разумеется).

Такая же хрень и с WindowFinder. Похоже, что элементы интерфейса отрисовываются движком браузера, т.е. являются графическими элементами, а не оконными.
У меня тут нету IE, но есть 3 других браузера: FireFox, Opera и GoogleChrome. Я грузанул в них один и тот же URL - http://www.google.ru/. В разных браузерах кнопки "Поиск в Google" и "Мне повезёт!" выглядят и реагируют на перемещение над ними курсора мыши по-разному.

Если бы админ к этому моменту доделал вставку картинок в форум, я бы вывалил скриншоты.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 31 марта 2010, 19:09 [#9]:

to Никоноров К.С.
Сложно поверить в то, что кнопка, которую видно в брозере не является кнопкой? вполне нормальное решения. В недрах апи функций можно найти такие, которые умеют отрисовать элемент управления. Такой элемент не будет иметь хендла.

С другой стороны, создания реальной кнопки в броузере создало бы кучу проблем, поэтому от такой идеи и отказались наверное.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 31 марта 2010, 19:17 [#10]:

Цитата (Вадим К):

поэтому от такой идеи и отказались наверное.

И правильно сделали. Ибо плодить временные оконные элементы - роскошь для ресурсов системы.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
QWERYTY

QWERYTY (статус: Посетитель), 31 марта 2010, 19:26 [#11]:

Ну понятно, на дурачка не прокатит:) Я не очень понимаю что происходит может и являются графическими элементами, а не оконными но должен ведь быть способ на них воздействовать.
Вобщем задача кликнуть по кнопке, это я умею зная хендл.
Может есть другие варианты выйти на кнопку(или её илюзию) :)
Буду рад любым советам по данному вопроссу.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
QWERYTY

QWERYTY (статус: Посетитель), 31 марта 2010, 22:04 [#12]:

Спасибо вам Паровоз, указали в каком направлении рыть.
Кнопка№1 в вашем коде полностью ясна, вторая круто(но мне пока не нужно так делать), а вот третья бесценна.

Я хотел кликнуть по кнопке отправив сообщение зная её хендл:

SendMessage(h,WM_LBUTTONDOWN,0,0);
SendMessage(h,WM_LBUTTONUP,0,0);
где h и есть хендл кнопки.

Но как я вижу это делается по другому.



ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ТО ЧТО ОТОЗВАЛИСЬ И ПРОЯСНИЛИ СИТУАЦИЮ.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.

30 мая 2011, 03:09: Вопрос закрыт (решение принял автор вопроса — QWERYTY): Вопрос исчерпан

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:49
Выполнено за 0.03 сек.