Страница 1 из 1

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

Добавлено: 09 мар 2010, 09:01
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? Или где про это почитать?

Заранее благодарен.

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

Добавлено: 09 мар 2010, 19:04
pol_ice

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

Добавлено: 11 мар 2010, 08:46
i_van
pol_ice писал(а):Может быть оно?
http://www.moshkin.info/blog/accessing- ... er-process
Не совсем то... Это скорее про контент окна, чем про управление окном. Но статья интересная, особенно для хакеров.

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

Добавлено: 12 мар 2010, 14:51
Elbonian
Я с этим мучился пару лет назад, но на С++. Кошмарный контрол. Спускался до нижнего, от родителя до ребенка при помощи CWnd::FindWindowEx, передавая classname - последовательно "Shell Embedding", "Shell DocObject View", "Internet Explorer_Server". Сдается мне что в C# аналога FindWindowEx нет, но всегда можно попытаться использовать pinvoke. В общем, сочуствую.

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

Добавлено: 12 мар 2010, 14:57
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, по-моему.

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

Добавлено: 24 мар 2010, 10:42
polkov
не понятно что ты хочешь но мои 2 копейки
-хтмл таги - это не виндовые окна
-лови wm-paint ивент - онпайнт не всегда вызывается.

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

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

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

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

Но за любой совет благодарен.

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

Добавлено: 29 мар 2010, 17:21
polkov
у формы есть ивент на полную загрузку - вызывай джавускрипт и кликай на невидимом элементе.
а клик от элемента лови в программе - ну и рисуй.

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

Добавлено: 30 мар 2010, 08:44
i_van
polkov писал(а):у формы есть ивент на полную загрузку - вызывай джавускрипт и кликай на невидимом элементе.
а клик от элемента лови в программе - ну и рисуй.
Полная загрузка это еще далеко не отрисовка, что собственно в моем случае и происходит.
Например у меня загрузка лишь начало длинного процесса (причем асинхронного): с Google сервера запрашивается обьект (когда он придет еще вопрос), затем пришедший объект начинает грузить свой контент (картинки) и когда он их отрисует только одному богу известно.
Посему самое разумное, что я придумал - это перехватывать рисование в самом конце процесса. Хотя на самом то деле мне надо момент окончания рисования.

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

Добавлено: 30 мар 2010, 16:22
polkov
у ассинхронных объектов обычно есть ивенты на окончание - дальше джаваскрипт и пр.

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

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

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

Добавлено: 03 апр 2010, 03:15
polkov
приснился воркэраунд -
-делаешь элемент с прозрачным бэкграндом
-кладешь поверх твоих асснхронных штучек
-рисуешь на нем че хошь и когда хошь
-и пофиг перерисовки под ним - ничего не перекроют.
:lol:

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

Добавлено: 05 апр 2010, 10:33
i_van
polkov писал(а):приснился воркэраунд -
-делаешь элемент с прозрачным бэкграндом
-кладешь поверх твоих асснхронных штучек
-рисуешь на нем че хошь и когда хошь
-и пофиг перерисовки под ним - ничего не перекроют.
:lol:
Именно так все и работает. MyWnd в предыдущем примере и есть прозрачное окно. Но прозрачность не дается даром :) . Видимо оно слегка не так работает как обычное окно или баг где-то в .NET 2. Во всяком случае перерисовки под ним в браузере его затирают. :?

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

Добавлено: 10 май 2010, 18:18
polkov
недавно столкнулся с фигней что не все загружено на онлоад ивенте - помогло
Sys.Application.add_load

может тебе поможет?