| 
| 
 | Вопрос # 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): Вопрос исчерпан Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |