|
Вопрос # 3 954/ вопрос закрыт / |
|
Здравствуйте, уважаемые эксперты!
Возникла проблема при использовании функции FindWindowEx.
Моя программа является браузером(интернет браузером), я получаю хендл браузера вот так:
h:=WebBrowser1.Handle;
На этом этапе всё нормально, но когда я пытаюсь спуститься на уровень ниже(в WebBrowser1) вот так:
z:=Edit1.Text; //здесь я ввожу названия кнопок
h:=WebBrowser1.Handle;
k:= FindWindowEx(h,0,nil,'z');
и превратить хендл браузера в родительский чтоб в нём искать дочерние, функция FindWindowEx возвращает нули.
Что это за напасть и как с ней бороться???
Спасибо за внимание.
 |
Вопрос задал: 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™ (статус: Доктор наук), 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™ (статус: Доктор наук), 31 марта 2010, 11:41 [#4]:
Цитата (Вадим К):
В поставке VisualStudio есть приложения Spy++. Оно позволяет подсмотреть всю иерархию.
Да таких программ - вагон и маленькая тележка.
Например WindowFinder - крохотная (~50 кб) программулина, с исходниками. Могу прислать.
Дай URL какуой-нить страницы с кнопками, я попробую её просканировать в IE на предмет хэндлов на кнопках.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 31 марта 2010, 13:55 [#6]:
На этой странице, загруженной в IE, WindowFinder кнопок не нашёл. На google.ru - тоже.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
QWERYTY (статус: Посетитель), 31 марта 2010, 18:48 [#7]:
Насчёт переменной в кавычках вы правы, наверное не очень полезно писать проги в пять часов утра.
WindowFinder я не скачал(где пишут что платная, где по ссылке не переходит), но использовал WndInfo. Есть подозрения что это очень похожие вещи. Дело в том что WndInfo показывает один хендл куда бы я не наводил курсор(в пределах WebBrowser1 разумеется). Вот я и пытаюсь по тойже логике найти дочерние в WebBrowser1 указав его хендл как родительский, а по названиям кнопок найти их хендлы.
На самой проге всё работает(по крайней мере показания совпадают с WndInfo).
В чём принципиальная разница между окном браузера и окном программы на уровне хендлов??? Может там названия кнопок не такие как кажется???
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
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™ (статус: Доктор наук), 31 марта 2010, 19:17 [#10]:
Цитата (Вадим К):
поэтому от такой идеи и отказались наверное.
И правильно сделали. Ибо плодить временные оконные элементы - роскошь для ресурсов системы.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
QWERYTY (статус: Посетитель), 31 марта 2010, 19:26 [#11]:
Ну понятно, на дурачка не прокатит Я не очень понимаю что происходит может и являются графическими элементами, а не оконными но должен ведь быть способ на них воздействовать.
Вобщем задача кликнуть по кнопке, это я умею зная хендл.
Может есть другие варианты выйти на кнопку(или её илюзию) 
Буду рад любым советам по данному вопроссу.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
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): Вопрос исчерпан
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|