С нами с 24.03.03
Сообщения: 108
Рейтинг: 42
|
Добавлено: 19/05/05 в 18:27 |
Для заполнения html форм я использую функциональность IE, подключая его ActiveX к своему приложению. Гружу html документ, затем используя методы объектов, расположенных на форме, заполяю их данными и программно жму кнопку Sumbit. Все замечательно. Все работает. Однако проблема возникает при попытке заполнения полей вида
input type="file" (используется например для указания пути до тумба при забмите галереи в тгп - на html рядом с таким полем будет кнопка browse)
Дело в том, что майкрософт не стала реализовыать для такого элемента метод Set_Value. Т.е. программно присвоить значение этому полю классическим методом нельзя.
Возможен следующий вариант решния проблемы: копировать в буфер обмена текст, который нужно поместить в поле, средствами win api находить нужное поле ввода, переводить фокус ввода на него, устанавливая туда курсор и посылать сообщение о нажатии гоячих клавиш Ctrl+V, т.е. моделировать поведение живого польователя (вродже как подобным образом работает AI Roboform). Правда у данного метода есть один большой недостаток: во время работы программы делать что-либо другое на компьютере будет затруднительно, ибо фокус ввода будет прыгать непредсказуемо...
Подскажите, уважаемые, как вы выходите из подобного положения, если конечно кто сталкивался (в первую очередь конечно это авторы сабмиттеров).
Спасибо.
|
|
|
|
/dev/awm
С нами с 05.02.04
Сообщения: 2300
Рейтинг: 1127
|
Добавлено: 19/05/05 в 21:06 |
Почитай про DOM-модель IE. Через нее можно сделать все. Хотя если ты говоришь что через ActivX не получилось к этому полю получить доступ, то не исключено что и через DOM-модель не выйдет. Хотя "за попробовать" денег не бурут.
Получать доступ к окну с формой - нереально. Именно из-за этой DOM-модели. Возьми утилиту Spy++ (не путать со спайварой :) это утилита для дебагинга виндов) и попробуй с помощью нее найти это окошко. Фиг там. Есть только окно адресной строки и ВСЕ окно ИЕ. Вот его как раз берешь, от него хватаешь IHTMLDocument и потом через COM-овские интерфейсы вытаскиваешь оттуда все.
|
|
|
|
С нами с 24.03.03
Сообщения: 108
Рейтинг: 42
|
Добавлено: 20/05/05 в 07:14 |
Дык...
Я и говорю, что чрезе IHTMLDocument все как раз работает суперски.
Кроме одной проблемы, состоящей в том, что один из методов для одного из контролов не реализован майкрософт из соображений безопасности (ну я все это писал выше)
Вопрос в том, кто как решает именно эту пробоему...
|
|
|
|
adult - мое хобби
С нами с 17.10.02
Сообщения: 1124
Рейтинг: 262
|
Добавлено: 20/05/05 в 10:42 |
Сам когда то бился - но не решил проблему
А как на остальных сабмитерах, ты не знаешь?
|
|
|
|
С нами с 24.03.03
Сообщения: 108
Рейтинг: 42
|
Добавлено: 20/05/05 в 11:58 |
Да в том-о и дело, что я свой сабмиттер с 2001 года развиваю и вражеские ни разу не использовал (хотя это наверное стратегическая ошибка )
Решить бы этот вопрос и огромная куча сайтов, которые сейчас сабмитятся в ручном режиме ушли бы в автоматический.
Я вот тут подумал, поскольку речь идет только о локальной машине пользователя сабмитера, то наверное реально создать патч, который один раз патчит движок html-я и для этого типа поля ввода вместо заглушки на методе Set_Value ставит вызов этого метода, но от простого поля воода, где все работает нормально. Я почти уверен, что все эти поля наследуются от одного класса, так что по-логике такое возможно.
Только моей квалификации точно на это не хватит
|
|
|
|
С нами с 05.08.03
Сообщения: 336
Рейтинг: 114
|
Добавлено: 20/05/05 в 14:21 |
Слова то какие "использую функциональность", ты часом не иностранец? Почитай rsdn или майкрософтные юзергруппы, там периодически такие вопли про поле "file" раздаются.
JpS писал: | Получать доступ к окну с формой - нереально. Именно из-за этой DOM-модели. Возьми утилиту Spy++ и попробуй с помощью нее найти это окошко. Фиг там. Есть только окно адресной строки и ВСЕ окно ИЕ. Вот его как раз берешь, от него хватаешь IHTMLDocument и потом через COM-овские интерфейсы вытаскиваешь оттуда все. |
да без проблем hwnd контрола через DOM получить, через iwindow если мои старческая память не подводит, только не помогет К тому же существует еще одна пакость: оконные функции таже setwindowtext будут работать в рамках одного приложения, а обращаться вы к ним будете из другого, что несколько усложняет реализацию.
зы: фсем привет.
|
|
|
|
С нами с 05.10.04
Сообщения: 478
Рейтинг: 207
|
Добавлено: 20/05/05 в 17:14 |
А если не setwindowtext, а через sendmessage, используя WM_SETTEXT, не прокатит? Раз уж hwnd имеем, то это лишь реально именно чуть чуть усложняет, но никак не делает невозможным...
ЗЫ: взглянуть хотябы на примеры "приложений" изменяющих заголовок окна любого приложения, которые кто как пишет... сколько людей - столько и версий... можно покопаться, поэкспериментировать.
ЗЗЫ: можно вообще самым извращенным способом - обрабатывать html самостоятельно Там уж точно ничего не ограничит...
|
|
|
|
/dev/awm
С нами с 05.02.04
Сообщения: 2300
Рейтинг: 1127
|
Добавлено: 20/05/05 в 17:32 |
VinilNavigator писал: | А если не setwindowtext, а через sendmessage, используя WM_SETTEXT, не прокатит? Раз уж hwnd имеем, то это лишь реально именно чуть чуть усложняет, но никак не делает невозможным...
ЗЫ: взглянуть хотябы на примеры "приложений" изменяющих заголовок окна любого приложения, которые кто как пишет... сколько людей - столько и версий... можно покопаться, поэкспериментировать.
ЗЗЫ: можно вообще самым извращенным способом - обрабатывать html самостоятельно :) Там уж точно ничего не ограничит... |
RTFM, setwindowtext _ничего более_ не делает, кроме как вызывает sendmessage(WM_SETTEXT...
а вот насчет парсить хтмль на пролете - вот это мне кажется решением. не нужно полностью брать на себя задачу браузера, просто перед отдачей его ИЕ, его надо подкоректировать на свои нужды и вуаля :)
|
|
|
|
С нами с 05.08.03
Сообщения: 336
Рейтинг: 114
|
Добавлено: 20/05/05 в 22:10 |
JpS писал: | а вот насчет парсить хтмль на пролете - вот это мне кажется решением. не нужно полностью брать на себя задачу браузера, просто перед отдачей его ИЕ, его надо подкоректировать на свои нужды и вуаля |
Браво, изящное решение, если DOM позволяет, можно менять тип контрола, делать свое чёрное дело, а затем обратно менять, как-будто ничего и не было.
|
|
|
|
/dev/awm
С нами с 05.02.04
Сообщения: 2300
Рейтинг: 1127
|
Добавлено: 20/05/05 в 22:19 |
$elect писал: | Браво, изящное решение, если DOM позволяет, можно менять тип контрола, делать свое чёрное дело, а затем обратно менять, как-будто ничего и не было. |
ну дальше уже по вкусу... дом позволяет
|
|
|
|
С нами с 05.08.03
Сообщения: 336
Рейтинг: 114
|
Добавлено: 21/05/05 в 13:10 |
Не совсем по вкусу, контрол типа "file" отдает выбранный файл с локального диска на сервер (upload), поэтому необходимо перед отправкой формы все менять взад. Кстати я попробовал изменять таким образом тип и пока результат отрицательный.
|
|
|
|
С нами с 18.08.04
Сообщения: 6376
Рейтинг: 4430
|
Добавлено: 22/05/05 в 14:17 |
А у меня была идея сделать все как у хамелеона то есть нахуй от IE отказаться. Но многие любят наблюдать за ходом поэтому пока и не делаю. зато для дайлапщиков вообще тема трафа не жрет
|
|
|
|
С нами с 24.03.03
Сообщения: 108
Рейтинг: 42
|
Добавлено: 23/05/05 в 09:13 |
Конечно красиво было бы отказаться от IE. Я так понимаю для этого нужно напрямую запихивать данные через http запросы?
Правда пара возражений все-равно есть:
1. Если смотреть на сам сабмит может кто и не хочет, то на страницы-конфирмы наверное большинство смотреть все-таки хотят - так что половина трафика все-равно остается.
2. Простейшую форму думаю не очень сложно отправить, а вот если рассмотреть случай, когда сабмит защищен кодом? Там надо целый спектакль из http команд городить - дергать скрипт генерации этого самого кода, получать его, распознавать/показывать пользователю. Хотя если бы я начинал сейчас, то наверное пошел бы этим путем...
|
|
|
|
С нами с 05.06.03
Сообщения: 628
Рейтинг: 415
|
Добавлено: 23/05/05 в 09:22 |
Мы когда писали свой сабмиттер - только через буфер проблему решили, по другому не как не получалось
|
|
|
|
С нами с 24.02.05
Сообщения: 75
Рейтинг: 123
|
Добавлено: 24/05/05 в 14:16 |
+1 буфер обмена
|
|
|
|