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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 5 525

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

Здравствуйте!
Пишу программу,которая будет взаимодействовать с веб страницей. Компонент webbrowser загружает страницу, и нужно сэмулировать нажатие кнопки таб. но тут возникает проблема, такое ощущение что страница после каждого вызова загружатся заново и результата никакого. пробовал поставить edit, с ним работает эмуляция. У кого нибудь есть какие нибудь преположения. Еще вот что, окно будет неактывным и вообще скрытым.
Благодарю за помощь.

Приложение:
  1. procedure EmulateKey(Wnd: HWND; VKey: Integer);
  2. asm
  3. push 0
  4. push edx
  5. push 0101H //WM_KEYUP
  6. push eax
  7. push 0
  8. push edx
  9. push 0100H //WM_KEYDOWN
  10. push eax
  11. call PostMessage
  12. call PostMessage
  13. end;
  14.  
  15.  
  16. EmulateKey(WebBrowser1.Handle, VK_TAB);


KilkaMS Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: KilkaMS (статус: Посетитель)
Вопрос отправлен: 25 июля 2011, 18:33
Состояние вопроса: открыт, ответов: 0.


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

Всего сообщений: 15; последнее сообщение — 26 июля 2011, 17:53; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 25 июля 2011, 19:05 [#1]:

а зачем то код на ассемблере? так ведь понятнее и красивее.
procedure EmulateKey(Wnd: HWND; VKey: Integer);
begin
   PostMessage(wnd, WM_KEYDOWN, VKey,0);
   PostMessage(wnd, WM_KEYUP, VKey,0);
end;

Кнопка таб нажимается для чего? не для флеша на странице? или просто для перехода между полями? есть много способов, как это сделать проще.
Галочка "подтверждения прочтения" - вселенское зло.
KilkaMS

KilkaMS (статус: Посетитель), 25 июля 2011, 20:02 [#2]:

через PostMessage не получалось, для перехода между полями, поделитесь этими способами
Вадим К

Вадим К (статус: Академик), 25 июля 2011, 22:05 [#3]:

а попробуйте использовать sendmessage. Параметры такие же. Но только исключительно sendmessage.
Галочка "подтверждения прочтения" - вселенское зло.
KilkaMS

KilkaMS (статус: Посетитель), 26 июля 2011, 08:08 [#4]:

может я не туда посылаю?
SendMessage(WebBrowser1.handle, WM_KEYDOWN, VK_TAB,0);
SendMessage(WebBrowser1.handle, WM_KEYUP, VK_TAB,0);

проблема такаяже, как будто обновляется страница, и если нажимаю несколько раз на таб остается на том месте, куда после первого нажатия попала
min@y™

min@y™ (статус: Доктор наук), 26 июля 2011, 08:14 [#5]:

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

KilkaMS (статус: Посетитель), 26 июля 2011, 08:38 [#6]:

потому что программа будет работать в скрытом режиме, окно не будет отображено
min@y™

min@y™ (статус: Доктор наук), 26 июля 2011, 08:56 [#7]:

Цитата (KilkaMS):

потому что

Ответ на вопрос "зачем" нужно начинать со слов "для того, чтобы...". Это важно.

Цитата (KilkaMS):

программа будет работать в скрытом режиме, окно не будет отображено

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

KilkaMS (статус: Посетитель), 26 июля 2011, 09:05 [#8]:

а какие еще варианты есть? мне нужно совершить некие манипуляции на веб странице, поставить несколько галочек, нажать на кнопочку.
min@y™

min@y™ (статус: Доктор наук), 26 июля 2011, 09:12 [#9]:

Цитата (KilkaMS):

мне нужно совершить некие манипуляции на веб странице, поставить несколько галочек, нажать на кнопочку.

Надо просто составить нужный POST-запрос и отправить серверу. Нахрена городить TWebBrowser на скрытом окне-то? Да ещё эмулировать нажатие клавиш... Есть же модуль winsock.pas, есть компоненты Indy, есть компоненты ICS и т.п.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
KilkaMS

KilkaMS (статус: Посетитель), 26 июля 2011, 09:59 [#10]:

а можно пример использования?
min@y™

min@y™ (статус: Доктор наук), 26 июля 2011, 10:20 [#11]:

Цитата (KilkaMS):

а можно пример использования?

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

KilkaMS (статус: Посетитель), 26 июля 2011, 16:54 [#12]:

немного погугля наткнулся на
WebBrowser1.OleObject.Document.Example_box.checked
такой пример.
часть моего нтмл кода
</H3></TD>
<TD valign="top" class="ms-formbody" width="400px">
<!-- FieldName="SMS"
FieldInternalName="SMS"
FieldType="SPFieldBoolean"
-->
<span dir="none">
<input id="ctl00_m_g_bcb7e20a_5c6b_4d9b_b614_de038e953e74_ctl00_ctl04_ctl01_ctl00_ctl00_ctl04_ctl00_ctl00_BooleanField" type="checkbox" name="ctl00$m$g_bcb7e20a_5c6b_4d9b_b614_de038e953e74$ctl00$ctl04$ctl01$ctl00$ctl00$ctl04$ctl00$ctl00$BooleanField" /><br>
</span>


как я понял имя SMS нужно поставить. но чтото не очень получилось выполнить эту процедуру ктонибудь пользовался подбным методом уже?
KilkaMS

KilkaMS (статус: Посетитель), 26 июля 2011, 17:00 [#13]:

сделал так
ovElements := WebBrowser1.OleObject.Document.Forms.Item( 0 ).Elements;
for i := 0 to ( ovElements.Length-1 ) do
if ( AnsiUpperCase( ovElements.Item( i ).type ) = 'CHECKBOX' ) then
ovElements.Item( i ).checked:=true;
KilkaMS

KilkaMS (статус: Посетитель), 26 июля 2011, 17:29 [#14]:

вопрос такой появился,а как к элементу по id обратиться?
KilkaMS

KilkaMS (статус: Посетитель), 26 июля 2011, 17:53 [#15]:

по аналогии пытаюсь в комбобох изменить значение таким кодом
if ( AnsiUpperCase( ovElements.Item( i ).tagName ) = 'SELECT' ) then
ovElements.Item( i ).Value:='Ok';
приложение падает с ошибокой

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

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