Программирование для браузера
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
Программирование для браузера
Посоветуйте, граждане-товарищи, как добраться до внутренних окон браузера, или что почитать по этому поводу. В Гугле уже заблудился, начал ходить кругами.
Чуть подробнее:
Использую С# 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? Или где про это почитать?
Заранее благодарен.
Чуть подробнее:
Использую С# 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
- Контактная информация:
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
Re: Программирование для браузера
Не совсем то... Это скорее про контент окна, чем про управление окном. Но статья интересная, особенно для хакеров.pol_ice писал(а):Может быть оно?
http://www.moshkin.info/blog/accessing- ... er-process
-
- Частый Гость
- Сообщения: 12
- Зарегистрирован: 03 мар 2010, 13:00
- Откуда: Coquitlam
Re: Программирование для браузера
Я с этим мучился пару лет назад, но на С++. Кошмарный контрол. Спускался до нижнего, от родителя до ребенка при помощи CWnd::FindWindowEx, передавая classname - последовательно "Shell Embedding", "Shell DocObject View", "Internet Explorer_Server". Сдается мне что в C# аналога FindWindowEx нет, но всегда можно попытаться использовать pinvoke. В общем, сочуствую.
-
- Маньяк
- Сообщения: 1576
- Зарегистрирован: 04 окт 2009, 15:23
Re: Программирование для браузера
Собственно, с pinvoke(http://www.pinvoke.net/default.aspx/user32.findwindowex):Elbonian писал(а):Сдается мне что в C# аналога FindWindowEx нет, но всегда можно попытаться использовать pinvoke
Ну и с webtropy, до кучи (http://www.webtropy.com/articles/art9-1 ... ndWindowEx):[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);
Мопед не мой (в c# вообще ни в зуб ногой), я просто облегчить поиск хотел, если что. Знаю только, что подобные финты давным давно были нормой в VisualBasic начиная с 3.0, по-моему.[DllImport("user32", EntryPoint="FindWindowEx")]
public static extern int FindWindowExA(int hWnd1, int hWnd2, string lpsz1, string lpsz2)
- polkov
- Маньяк
- Сообщения: 1008
- Зарегистрирован: 24 мар 2010, 10:16
- Откуда: оттуда
- Контактная информация:
Re: Программирование для браузера
не понятно что ты хочешь но мои 2 копейки
-хтмл таги - это не виндовые окна
-лови wm-paint ивент - онпайнт не всегда вызывается.
-хтмл таги - это не виндовые окна
-лови wm-paint ивент - онпайнт не всегда вызывается.
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
Re: Программирование для браузера
All replies welcome. Собственно, что я хочу - это прорисовать свою графику, когда браузер закончит свое рисование.polkov писал(а):не понятно что ты хочешь но мои 2 копейки
похоже тут придется согласится...polkov писал(а):-хтмл таги - это не виндовые окна

Как поймать ивент я не знаю. Поэтому я на всякий случай ловлю WM_PAINT message.polkov писал(а):-лови wm-paint ивент - онпайнт не всегда вызывается.
Что любопытно, WM_PAINT даже не всегда посылается. И даже если посылается ( a Spy++ показывает что в моем случае это так), еще проблема поймать. Мне нужно поймать момент времени, когда окно гарантировано отрисовано. В этом случае какая-то очень хитрая конструкция получается.
В общем-то я patch сделал, перехватывая в хуке момент, когда BACKGROUND_ERASE отработал, и генерируя свое событие с задержкой - что для меня пока работает.
Но за любой совет благодарен.
- polkov
- Маньяк
- Сообщения: 1008
- Зарегистрирован: 24 мар 2010, 10:16
- Откуда: оттуда
- Контактная информация:
Re: Программирование для браузера
у формы есть ивент на полную загрузку - вызывай джавускрипт и кликай на невидимом элементе.
а клик от элемента лови в программе - ну и рисуй.
а клик от элемента лови в программе - ну и рисуй.
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
Re: Программирование для браузера
Полная загрузка это еще далеко не отрисовка, что собственно в моем случае и происходит.polkov писал(а):у формы есть ивент на полную загрузку - вызывай джавускрипт и кликай на невидимом элементе.
а клик от элемента лови в программе - ну и рисуй.
Например у меня загрузка лишь начало длинного процесса (причем асинхронного): с Google сервера запрашивается обьект (когда он придет еще вопрос), затем пришедший объект начинает грузить свой контент (картинки) и когда он их отрисует только одному богу известно.
Посему самое разумное, что я придумал - это перехватывать рисование в самом конце процесса. Хотя на самом то деле мне надо момент окончания рисования.
- polkov
- Маньяк
- Сообщения: 1008
- Зарегистрирован: 24 мар 2010, 10:16
- Откуда: оттуда
- Контактная информация:
Re: Программирование для браузера
у ассинхронных объектов обычно есть ивенты на окончание - дальше джаваскрипт и пр.
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
Re: Программирование для браузера
Да, это было бы хорошо.polkov писал(а):у ассинхронных объектов обычно есть ивенты на окончание - дальше джаваскрипт и пр.
Точнее оно и есть хорошо, так как часть для части запросов такие события генерируется и я их обрабатываю.
Однако есть и другие запросы, которые ничего не генерируют. Вот для них вся эта конструкция и делается.
Плюс к тому встречается перерисовка без всяких скриптов: открываешь какое-нибудь окно W1, перекрывающее браузер Br и мою графику MyWnd. Затем W1 схлопываешь. MyWnd перерисовывается первым и Br его затем затирает, перерисовывая свой контент. А нужно наоборот сначала Br, затем MyWnd.
- polkov
- Маньяк
- Сообщения: 1008
- Зарегистрирован: 24 мар 2010, 10:16
- Откуда: оттуда
- Контактная информация:
Re: Программирование для браузера
приснился воркэраунд -
-делаешь элемент с прозрачным бэкграндом
-кладешь поверх твоих асснхронных штучек
-рисуешь на нем че хошь и когда хошь
-и пофиг перерисовки под ним - ничего не перекроют.

-делаешь элемент с прозрачным бэкграндом
-кладешь поверх твоих асснхронных штучек
-рисуешь на нем че хошь и когда хошь
-и пофиг перерисовки под ним - ничего не перекроют.

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


- polkov
- Маньяк
- Сообщения: 1008
- Зарегистрирован: 24 мар 2010, 10:16
- Откуда: оттуда
- Контактная информация:
Re: Программирование для браузера
недавно столкнулся с фигней что не все загружено на онлоад ивенте - помогло
Sys.Application.add_load
может тебе поможет?
Sys.Application.add_load
может тебе поможет?