WebControl и WM_PAINT
От: i_van  
Дата: 09.03.10 23:09
Оценка:
Посоветуйте, граждане-товарищи, как добраться до внутренних окон браузера, или что почитать по этому поводу. В Гугле уже заблудился, начал ходить кругами.

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

Использую С# 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? Или где про это почитать?

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


10.03.10 10:03: Перенесено модератором из '.NET' — TK
Re: WebControl и WM_PAINT
От: TK Лес кывт.рф
Дата: 10.03.10 07:03
Оценка:
Здравствуйте, i_van, Вы писали:

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


Почитайте про API функцию SetWindowsHookEx. Для какого окна надо установить хук вы уже знаете.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: WebControl и WM_PAINT
От: Pavel Dvorkin Россия  
Дата: 10.03.10 08:44
Оценка:
Здравствуйте, i_van, Вы писали:

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


Он может его не получать только если ни один пиксель его клиентской области не явлвется видимым (то есть вся клиентская область чем-то закрыта). Но тогда ему 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


>но дальше по иерархии WM_PAINT не всплывает


И не должно. Судя по всему, предки этого окна видимых пикселей не имеют.

>Как получить указатель на это окно?


В .NET не знаю, а в Win32 просто — EnumChildWindows. Начать с Windows Form10.Window.8.app.378734a , перебрать его чайлдов, найти нужны, с ним то же самое и т.д. Можно еще FindWindowsEx, если есть критерий для поиска


>Или хотя бы pop up WM_PAINT до уровня WebContol?


Судя по твоему описанию — бессмысленно, оно ему не нужно.Но, должен сказать, я совсем не уверен в том что то, что ты написал, верно.
Лучше всего запусти Spy++ (входит в состав VS) и проверь все, в том числе иерархию, размеры и перекрытие.
With best regards
Pavel Dvorkin
Re[2]: WebControl и WM_PAINT
От: i_van  
Дата: 10.03.10 19:10
Оценка:
Здравствуйте, TK, Вы писали:

TK>Здравствуйте, i_van, Вы писали:


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


TK>Почитайте про API функцию SetWindowsHookEx. Для какого окна надо установить хук вы уже знаете.


Примерно это я и собирался сделать: перехватить сообщение на уровне InternetExplorer_Server.
Но вся беда в том, что я нахожусь в WebBrowser и там нет прямого доступа к внутренним окнам (я даже толком не знаю почему их столько). Диаграмма получена при помощи Spy.
По информации из интернета WebBrowser это wrapper вокруг axIWebBrowser2, который видимо и является InternetExplorer_Server окном. Вот я и ищу handler этого окна.
Re[2]: WebControl и WM_PAINT
От: i_van  
Дата: 10.03.10 19:46
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

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


PD>Он может его не получать только если ни один пиксель его клиентской области не явлвется видимым (то есть вся клиентская область чем-то закрыта). Но тогда ему WM_PAINT и не нужен вообще.


Это очень интересная мысль, поскольку вся конструкция (WebBrowser conrol), описанная ниже, на самом деле сверху перекрывается прозрачным окном (назовем его Transp), в котором я рисую свою графику.
Я ожидал, что система сама разберется, что и как рисовать. Но случилось, что Transp перерисовывается быстро, а WebBrowser медленно и рисует после него (Transp) поверху, хотя и расположен ниже.
Возможно это глюк, а возможно, что WebBrowser имеет собственный необычный механизм рисования. Вот я и хочу получить от него информацию, что он закончил рисование и затем перерисовать Transp.

_>>Windows Form10.Window.8.app.378734a (WebBrowser control)

_>> |
_>> |
_>> Window Shell Embedding
_>> |
_>> |
_>> Shell Doc Object View
_>> |
_>> |
_>> InternetExplorer_Server

_>>Последнее окно в иерархии (InternetExplorer_Server) и получает WM_PAINT


PD>Вполне логично. Оно имеет видимые пиксели, поэтому должно уметь себя перерисовать, для чего ему шлют, а он обрабатывает WM_PAINT



>>но дальше по иерархии WM_PAINT не всплывает


PD>И не должно. Судя по всему, предки этого окна видимых пикселей не имеют.


Буду проверять. Что смотреть? Какой-нибудь стиль visible?

>>Как получить указатель на это окно?


PD>В .NET не знаю, а в Win32 просто — EnumChildWindows. Начать с Windows Form10.Window.8.app.378734a , перебрать его чайлдов, найти нужны, с ним то же самое и т.д. Можно еще FindWindowsEx, если есть критерий для поиска



>>Или хотя бы pop up WM_PAINT до уровня WebContol?


PD>Судя по твоему описанию — бессмысленно, оно ему не нужно.Но, должен сказать, я совсем не уверен в том что то, что ты написал, верно.

В моей ситуации (см. первый коммент) похоже, что это имеет смысл.

PD>Лучше всего запусти Spy++ (входит в состав VS) и проверь все, в том числе иерархию, размеры и перекрытие.

Диаграмма получена в Spy++. Все четыре окна имеют одинаковые размеры и лежат друг на друге.
Накопал, что WebBrowser является wrapper вокруг какого-то Win32 окна (видимо это то, что я вижу как InternetExplorer_Server).
Re[3]: WebControl и WM_PAINT
От: TK Лес кывт.рф
Дата: 12.03.10 17:04
Оценка:
Здравствуйте, i_van, Вы писали:


_>Примерно это я и собирался сделать: перехватить сообщение на уровне InternetExplorer_Server.

_>Но вся беда в том, что я нахожусь в WebBrowser и там нет прямого доступа к внутренним окнам (я даже толком не знаю почему их столько). Диаграмма получена при помощи Spy.
_>По информации из интернета WebBrowser это wrapper вокруг axIWebBrowser2, который видимо и является InternetExplorer_Server окном. Вот я и ищу handler этого окна.

Можно искать подобным
Автор: TK
Дата: 15.01.10
способом
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.