Программирование для браузера

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

Программирование для браузера

Сообщение i_van »

Посоветуйте, граждане-товарищи, как добраться до внутренних окон браузера, или что почитать по этому поводу. В Гугле уже заблудился, начал ходить кругами.

Чуть подробнее:

Использую С# WebBrowser control. Нужно модифицировать OnPaint(), в частности информировать другой класс, что браузер перерисовал свой контент. Исследование показало, что сам WebBrowser control месседж WM_PAINT не получает. Он имеет вложенные окна, как-то:

Windows Form10.Window.8.app.378734a (WebBrowser control)
|
|
Window Shell Embedding
|
|
Shell Doc Object View
|
|
InternetExplorer_Server

Последнее окно в иерархии (InternetExplorer_Server) и получает WM_PAINT, но дальше по иерархии WM_PAINT не всплывает. Как получить указатель на это окно? Или хотя бы pop up WM_PAINT до уровня WebContol? Или где про это почитать?

Заранее благодарен.
Аватара пользователя
pol_ice
Пользователь
Сообщения: 197
Зарегистрирован: 11 сен 2009, 04:59
Откуда: Бишкек->Vancouver
Контактная информация:

Re: Программирование для браузера

Сообщение pol_ice »

i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

Re: Программирование для браузера

Сообщение i_van »

pol_ice писал(а):Может быть оно?
http://www.moshkin.info/blog/accessing- ... er-process
Не совсем то... Это скорее про контент окна, чем про управление окном. Но статья интересная, особенно для хакеров.
Elbonian
Частый Гость
Сообщения: 12
Зарегистрирован: 03 мар 2010, 13:00
Откуда: Coquitlam

Re: Программирование для браузера

Сообщение Elbonian »

Я с этим мучился пару лет назад, но на С++. Кошмарный контрол. Спускался до нижнего, от родителя до ребенка при помощи CWnd::FindWindowEx, передавая classname - последовательно "Shell Embedding", "Shell DocObject View", "Internet Explorer_Server". Сдается мне что в C# аналога FindWindowEx нет, но всегда можно попытаться использовать pinvoke. В общем, сочуствую.
Rai
Маньяк
Сообщения: 1576
Зарегистрирован: 04 окт 2009, 15:23

Re: Программирование для браузера

Сообщение Rai »

Elbonian писал(а):Сдается мне что в C# аналога FindWindowEx нет, но всегда можно попытаться использовать pinvoke
Собственно, с pinvoke(http://www.pinvoke.net/default.aspx/user32.findwindowex):
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);
Ну и с webtropy, до кучи (http://www.webtropy.com/articles/art9-1 ... ndWindowEx):
[DllImport("user32", EntryPoint="FindWindowEx")]
public static extern int FindWindowExA(int hWnd1, int hWnd2, string lpsz1, string lpsz2)
Мопед не мой (в c# вообще ни в зуб ногой), я просто облегчить поиск хотел, если что. Знаю только, что подобные финты давным давно были нормой в VisualBasic начиная с 3.0, по-моему.
Аватара пользователя
polkov
Маньяк
Сообщения: 1008
Зарегистрирован: 24 мар 2010, 10:16
Откуда: оттуда
Контактная информация:

Re: Программирование для браузера

Сообщение polkov »

не понятно что ты хочешь но мои 2 копейки
-хтмл таги - это не виндовые окна
-лови wm-paint ивент - онпайнт не всегда вызывается.
i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

Re: Программирование для браузера

Сообщение i_van »

polkov писал(а):не понятно что ты хочешь но мои 2 копейки
All replies welcome. Собственно, что я хочу - это прорисовать свою графику, когда браузер закончит свое рисование.
polkov писал(а):-хтмл таги - это не виндовые окна
похоже тут придется согласится... :)
polkov писал(а):-лови wm-paint ивент - онпайнт не всегда вызывается.
Как поймать ивент я не знаю. Поэтому я на всякий случай ловлю WM_PAINT message.

Что любопытно, WM_PAINT даже не всегда посылается. И даже если посылается ( a Spy++ показывает что в моем случае это так), еще проблема поймать. Мне нужно поймать момент времени, когда окно гарантировано отрисовано. В этом случае какая-то очень хитрая конструкция получается.

В общем-то я patch сделал, перехватывая в хуке момент, когда BACKGROUND_ERASE отработал, и генерируя свое событие с задержкой - что для меня пока работает.

Но за любой совет благодарен.
Аватара пользователя
polkov
Маньяк
Сообщения: 1008
Зарегистрирован: 24 мар 2010, 10:16
Откуда: оттуда
Контактная информация:

Re: Программирование для браузера

Сообщение polkov »

у формы есть ивент на полную загрузку - вызывай джавускрипт и кликай на невидимом элементе.
а клик от элемента лови в программе - ну и рисуй.
i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

Re: Программирование для браузера

Сообщение i_van »

polkov писал(а):у формы есть ивент на полную загрузку - вызывай джавускрипт и кликай на невидимом элементе.
а клик от элемента лови в программе - ну и рисуй.
Полная загрузка это еще далеко не отрисовка, что собственно в моем случае и происходит.
Например у меня загрузка лишь начало длинного процесса (причем асинхронного): с Google сервера запрашивается обьект (когда он придет еще вопрос), затем пришедший объект начинает грузить свой контент (картинки) и когда он их отрисует только одному богу известно.
Посему самое разумное, что я придумал - это перехватывать рисование в самом конце процесса. Хотя на самом то деле мне надо момент окончания рисования.
Аватара пользователя
polkov
Маньяк
Сообщения: 1008
Зарегистрирован: 24 мар 2010, 10:16
Откуда: оттуда
Контактная информация:

Re: Программирование для браузера

Сообщение polkov »

у ассинхронных объектов обычно есть ивенты на окончание - дальше джаваскрипт и пр.
i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

Re: Программирование для браузера

Сообщение i_van »

polkov писал(а):у ассинхронных объектов обычно есть ивенты на окончание - дальше джаваскрипт и пр.
Да, это было бы хорошо.
Точнее оно и есть хорошо, так как часть для части запросов такие события генерируется и я их обрабатываю.
Однако есть и другие запросы, которые ничего не генерируют. Вот для них вся эта конструкция и делается.
Плюс к тому встречается перерисовка без всяких скриптов: открываешь какое-нибудь окно W1, перекрывающее браузер Br и мою графику MyWnd. Затем W1 схлопываешь. MyWnd перерисовывается первым и Br его затем затирает, перерисовывая свой контент. А нужно наоборот сначала Br, затем MyWnd.
Аватара пользователя
polkov
Маньяк
Сообщения: 1008
Зарегистрирован: 24 мар 2010, 10:16
Откуда: оттуда
Контактная информация:

Re: Программирование для браузера

Сообщение polkov »

приснился воркэраунд -
-делаешь элемент с прозрачным бэкграндом
-кладешь поверх твоих асснхронных штучек
-рисуешь на нем че хошь и когда хошь
-и пофиг перерисовки под ним - ничего не перекроют.
:lol:
i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

Re: Программирование для браузера

Сообщение i_van »

polkov писал(а):приснился воркэраунд -
-делаешь элемент с прозрачным бэкграндом
-кладешь поверх твоих асснхронных штучек
-рисуешь на нем че хошь и когда хошь
-и пофиг перерисовки под ним - ничего не перекроют.
:lol:
Именно так все и работает. MyWnd в предыдущем примере и есть прозрачное окно. Но прозрачность не дается даром :) . Видимо оно слегка не так работает как обычное окно или баг где-то в .NET 2. Во всяком случае перерисовки под ним в браузере его затирают. :?
Аватара пользователя
polkov
Маньяк
Сообщения: 1008
Зарегистрирован: 24 мар 2010, 10:16
Откуда: оттуда
Контактная информация:

Re: Программирование для браузера

Сообщение polkov »

недавно столкнулся с фигней что не все загружено на онлоад ивенте - помогло
Sys.Application.add_load

может тебе поможет?
Ответить