| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: ActiveX/СОМ/CORBA > Отключить сообщения сайта (IWebBrowser2) |
| Автор: M1ndAction 3.6.2012, 16:33 |
| Использую IWebBrowser2 для отправки запросов на сайт. На сайтах активно используется JavaScript, поэтому проще было использовать WebBrowser, а не Indy, Synapse. Ищем на форму на странице, заполняем все параметры и нажимаем кнопку методом Click. Все обрабатывается без прямого участия пользователя, то есть окно WebBrowser не отображается, работает все в DLL. Проблема в том, что на некоторых сайтах выводятся различные сообщения, например, "Ваше сообщение успешно добавлено!" и тому подобные. Установка свойства silent не помогает. Как запретить вывод таких (да и любых других) сообщений? |
| Автор: Чучмек 3.6.2012, 16:51 | ||
| Если никак не удается отключить сообщения - то можно воспользоваться вставкой скрипта с подменой функций. Например вставка в страницу следующего кода избавит от alertа
|
| Автор: M1ndAction 3.6.2012, 18:12 |
| Интересно. То есть на лету, при загрузке, меняем страницу. А так как POST-запрос будет идти уже с этой измененной страницы, то вставленный JavaScript-код будет срабатывать и блокировать все сообщения, генерируемые другими JavaScript? |
| Автор: M1ndAction 5.6.2012, 11:39 | ||
Не получается сделать вставку скрипта. Испробовал несколько вариантов - ни один не сработал.
Функция загружает страницу и возвращает ее исходник. В чем может быть проблема? |
| Автор: M1ndAction 5.6.2012, 13:18 | ||
Можно-то можно, но далеко не всегда это удобно. В данном случае при отправлении POST-запроса посредством JavaScript генерируются некоторые нефиксированные параметры. Переносить эти алгоритмы в свою программу? Но где гарантия, что на другом сайте не будут добавлены еще какие-то JavaScript? Пусть и рассматривается одна CMS, но иногда их кастомизируют. Поэтому для меня удобнее было воспользоваться WebBrowser. Да и в целом тогда код получается лаконичнее (в мое случае). Хотя не спорю, работать с Synapse, Indy гораздо приятнее. Вокруг WebBrowser целый ореол всего-всего и лично я не вижу особой логики: например, чем отличаются IWebBrowser от IWebBrowser2, или, к примеру, Navigate от Navigate2 плюс куча других интерфейсов. Из-за этого одну и ту же задачу можно решать сотней способов, но работать будет один |
| Автор: Чучмек 5.6.2012, 14:19 | ||||
| Используй лучше TWebBrowser. Сейчас проверил D7/WinXPsp3/IE6 Вставка скрипта
Работает, но только, если, скрипт вставляется после того, как в окне IE разрешается "отображение активного содержимого".
|
| Автор: Чучмек 5.6.2012, 17:37 | ||
Вот сейчас проверил на XE2/Win7
работает |
| Автор: M1ndAction 6.6.2012, 06:48 |
| Спасибо, Чучмек, работает. Только в тексте исходников, который возвращает моя функция GetWB, нет скрипта. Но это не важно, главное конечный результат достигается (просто сначала подумал, что способ не работает). Чучмек, а можно отключить музыку на сайте? Это менее критично, чем сообщения, но тоже неприятно, когда из программы начинают раздаваться посторонние звуки. |
| Автор: Чучмек 6.6.2012, 14:01 |
| Интересует конкретный сайт или вообще для всех? Для конкретного - можно. Нужно смотреть html код, и искать чем и как выполняется проигрывание. |
| Автор: M1ndAction 7.6.2012, 12:16 | ||
| В идеале, конечно для всех Но скорее всего это просто исключение, и нет смысла из-за одного сайта что-то делать. Но с другой стороны, я посмотрел и, насколько понял, звук воспроизводится через флеш. Для дополнительной проверки воспроизвел на браузере без флеша - никакого звука не было. Поэтому было бы полезно отключить воспроизведение флеша, не подскажете как? Для примера, ссылка http://www.alphagm.ru/news.html/predlagaem-torgovoe-pomeschenie-v-akademgorodke?forum_ext=1 И еще вопрос. В примере со вставкой скрипта вы привели полный код - включая создание IWebBrowser2. У меня сделано совсем по-другому:
Это часть кода библиотеки. Приложение работает в многопоточном режиме, и каждый поток вызывает одну из функций библиотеки. Все работает нормально, за одним исключением. Когда все потоки отработали, я заново их запускаю, но возникает ошибка на этапе создания класса окна(wHandle := CreateWindowEx) - wHandle равен нулю, возвращает ошибку "Класс уже существует". Здесь непонятны два момента: 1. Ведь потоки потоки работают, то есть у нас создаются эти оконные классы раз за разом (точнее поток за потоком 2. И опять же, все что создается - освобождается: и wb, и wHandle. Так как, код, связанный с WebBrowser - не мой, вполне возможно, я что-то упустил. А если создавать IWebBrowser2 как у вас в примере, то видно, что появляются процессы IE (в моем способе их нет) и они остаются даже после закрытия программы (wb := nil не помогает). Да и как мне показалось, потоки стали очень медленно работать, как в однопоточном режиме. Поэтому первый способ мне кажется предпочтительнее, осталось только разобраться с этой ошибкой |
| Автор: Чучмек 7.6.2012, 12:31 | ||||
| Я пока особо не вчитывался, но... Регистрация класса происходит при создании каждого потока? По-моему RegisterClassEx нужно вызывать только один раз. Добавлено через 11 минут и 52 секунды
iwebbrowser2 в данном случае "ручка" к окну IE, который выполняется в своем процессе.
|
| Автор: MetalFan 7.6.2012, 17:49 | ||
Пробежаться по DOM структуре и "грохнуть" все <embed> и <object> |
| Автор: M1ndAction 8.6.2012, 07:34 | ||||||
А как это сделать? Что касается ошибки "Класс уже существует": нашел решение. Модифицируем код
на
Самое смешное, что это решение первым пришло мне в голову, ведь это так логично: если натыкаемся на "уже зарегистрированный" класс, то очевидно, что его нужно "разрегистрировать", то бишь UnregisterClass. Но в справке я нашел лишь procedure UnRegisterClass(AClass: TPersistentClass);, и начались длительные поиски. Как я смотрел - непонятно А решение, кстати, нашел здесь же, на форуме http://forum.vingrad.ru/forum/topic-313129/kw-registerclassex.html |
| Автор: Чучмек 8.6.2012, 10:23 |
| Зачем регистрировать класс при создании каждого окна? Зарегистрируй один раз при запуске программы (загрузке dll), и по завершении один раз вызывай Unregister. |
| Автор: M1ndAction 8.6.2012, 10:39 |
| Если регистрировать класс в основной программе (один раз), то нужно полученную переменную (WndClass: TWndClassEx) передавать в библиотеку, чтобы там можно было создать окно на базе этого класса, верно? Если так, то нужно передавать в виде параметра основной функции, что мне не подходит из-за наличия других библиотек с таким же объявлением функции. Есть ли какие-то альтернативы здесь? |
| Автор: Чучмек 8.6.2012, 10:56 | ||
| Можно добавить в dll функции Initialize/UnInitialize А можно использовать dllMain... Концовка dll должна выглядеть примерно так
|
| Автор: MetalFan 8.6.2012, 18:05 | ||
| По поводу отключения звука, советую скачать и поковырять, или даже заюзать http://www.bsalsa.com/. У него есть опция, отключающая звук... можно посмотреть, как это в нем реализовано. Не знаю, те ли это звуки....
А еще там есть DownloadOptions. там много чего можно поотключать) Во. DLCTL_DOWNLOADONLY: The page will only be downloaded, not displayed. Наверное то, что нужно. не? |
| Автор: M1ndAction 14.6.2012, 12:40 | ||||
ok, спасибо, посмотрю. Сейчас программа на общем тестировании, после реализую ваш вариант.
Пока проблема со звуком не критична - всего один сайт такой был, поэтому пока как исключение идет. По результатам тестирования уже будем смотреть, спасибо |