Отслеживать Draw везде (+)
От: athlontb  
Дата: 10.08.03 07:21
Оценка:
Здравствуйте !

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

Как это сделать?

Спасибо.
Re: Отслеживать Draw везде (+)
От: Valerio Россия linkedin.com/in/boronin
Дата: 10.08.03 12:50
Оценка: 4 (1)
Здравствуйте, athlontb, Вы писали:

A>Здравствуйте !


A>Надо отслеживать тот факт, что в любом окне, принадлежащем любому из запущенных приложений,

A>произошло изменение его графического вида, будь то изменение текста на кнопке либо что-то
A>другое. Причем необходимо знать, в каком конкретном окне это произошло, например hwnd кнопки.

A>Как это сделать?

если правильно, то написать свой mirror video driver и в нем поставить свой WNDOBJCHANGEPROCcallback через EngCreateWnd (see MSDN/DDK)

WNDOBJCHANGEPROC is a driver-defined callback function that GDI uses to notify the driver of changes to the window in question.

A>Спасибо.
... << RSDN@Home 1.1 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[2]: А не через Кремль ли?
От: athlontb  
Дата: 10.08.03 12:58
Оценка:
Почитал... в принципе реально, но не подходит мне
по ряду причин. Пока ничего предложить не могу, но ищу...
Re[3]: А не через Кремль ли?
От: B_A_D Израиль  
Дата: 10.08.03 14:05
Оценка:
Здравствуйте, athlontb, Вы писали:

A>Почитал... в принципе реально, но не подходит мне

A>по ряду причин. Пока ничего предложить не могу, но ищу...


Попробуй покопать в сторону SetWindowsHookEx...
Можно перехватить все сообшения WM_PAINT в системе
Re[2]: Отслеживать Draw везде (+)
От: Alex Fedotov США  
Дата: 10.08.03 15:52
Оценка: 4 (1) +1
Здравствуйте, Valerio, Вы писали:

A>>Надо отслеживать тот факт, что в любом окне, принадлежащем любому из запущенных приложений,

A>>произошло изменение его графического вида, будь то изменение текста на кнопке либо что-то
A>>другое. Причем необходимо знать, в каком конкретном окне это произошло, например hwnd кнопки.

A>>Как это сделать?

V>если правильно, то написать свой mirror video driver

Это да. Правда это mirror display driver.

V>и в нем поставить свой WNDOBJCHANGEPROCcallback через EngCreateWnd (see MSDN/DDK)


V>

V>WNDOBJCHANGEPROC is a driver-defined callback function that GDI uses to notify the driver of changes to the window in question.


А вот это нет. EngCreateWnd позволяет отслеживать положение и размеры окна, но ни как не изменения в его содержимом. Чтобы отслеживать изменения изображения, надо обрабатывать функции рисования Drv* в самом драйвере.
-- Alex Fedotov
Re[4]: А не через Кремль ли?
От: athlontb  
Дата: 10.08.03 19:37
Оценка:
B_A>Попробуй покопать в сторону SetWindowsHookEx...
B_A>Можно перехватить все сообшения WM_PAINT в системе

Сейчас попробую через
WH_CALLWNDPROCRET
Installs a hook procedure that monitors messages after they have been processed by the destination window procedure. For more information, see the CallWndRetProc hook procedure.

Че рез драйвер можно, но не подходит
Re[5]: А не через Кремль ли?
От: Alex Fedotov США  
Дата: 10.08.03 21:23
Оценка: +1
Здравствуйте, athlontb, Вы писали:

B_A>>Попробуй покопать в сторону SetWindowsHookEx...

B_A>>Можно перехватить все сообшения WM_PAINT в системе

A>Сейчас попробую через

A>WH_CALLWNDPROCRET
A>Installs a hook procedure that monitors messages after they have been processed by the destination window procedure. For more information, see the CallWndRetProc hook procedure.

Это не будет работать, просто поверь людям, которые это все попробовали. Многие органы управления рисуют не на WM_PAINT, а на другие сообщения: мышиные, клавиатурные, таймер.
-- Alex Fedotov
Re[3]: Отслеживать Draw везде (+)
От: Valerio Россия linkedin.com/in/boronin
Дата: 11.08.03 04:17
Оценка:
A>>>Как это сделать?
V>>если правильно, то написать свой mirror video driver

AF>Это да. Правда это mirror display driver.

так точно

V>>и в нем поставить свой WNDOBJCHANGEPROCcallback через EngCreateWnd (see MSDN/DDK)


V>>

V>>WNDOBJCHANGEPROC is a driver-defined callback function that GDI uses to notify the driver of changes to the window in question.


AF>А вот это нет. EngCreateWnd позволяет отслеживать положение и размеры окна, но ни как не изменения в его содержимом. Чтобы отслеживать изменения изображения, надо обрабатывать функции рисования Drv* в самом драйвере.

тоже верно, спасибо за уточнение: у себя делал все вместе некоторое время назад, уже забывается...
действительно без перехвата DDI не обойтись, впрочем это даже легче наверное, чем возиться с WNDOBJ_xxx
... << RSDN@Home 1.1 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[4]: А не через Кремль ли?
От: Valerio Россия linkedin.com/in/boronin
Дата: 11.08.03 04:22
Оценка:
B_A>Попробуй покопать в сторону SetWindowsHookEx...
B_A>Можно перехватить все сообшения WM_PAINT в системе
кстати с хуками классическими (типа реализации в VNC) есть проблемы — например с ловлей отрисовки меню — хуки тут бессильны

а по поводу хуков вообще — многие компоненты сейчас рисуют вообще из ядра (например, это AnimateWindow, т.е. все fade-in menu, заголовки, сворачивающиеся в таскбар и т.п.)

а ведь это бы тоже не хотелось терять?
... << RSDN@Home 1.1 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[5]: А не через Кремль ли?
От: athlontb  
Дата: 11.08.03 04:54
Оценка:
>>а по поводу хуков вообще — многие компоненты сейчас рисуют вообще из ядра ?
>>(например, это AnimateWindow, т.е. все fade-in menu, заголовки, сворачивающиеся в
>>таскбар и т.п.)

Да, все так и вышло... очень многое не ловится, особенно в нестандартных приложениях.
Придется рюхать...
Если у кого есть код на тему mirror display driver, подкиньте.
Re[4]: Отслеживать Draw везде (+)
От: Andrew S Россия http://alchemy-lab.com
Дата: 11.08.03 07:02
Оценка:
А почему бы не попробовать через MSAA (SetWinEventHook)?

Вполне работоспособно, судя по RemotelyAnyWhere и многим другим программам.
И проблем меньше. На первый взгляд.

AF>>А вот это нет. EngCreateWnd позволяет отслеживать положение и размеры окна, но ни как не изменения в его содержимом. Чтобы отслеживать изменения изображения, надо обрабатывать функции рисования Drv* в самом драйвере.

V>тоже верно, спасибо за уточнение: у себя делал все вместе некоторое время назад, уже забывается...
V>действительно без перехвата DDI не обойтись, впрочем это даже легче наверное, чем возиться с WNDOBJ_xxx
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Отслеживать Draw везде (+)
От: Alex Fedotov США  
Дата: 11.08.03 07:11
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>А почему бы не попробовать через MSAA (SetWinEventHook)?


AS>Вполне работоспособно, судя по RemotelyAnyWhere и многим другим программам.


Хм. Скачал я этот RemotelyAnyWhere. Устанавливать не стал, посмотрел в дистрибутив:

ramirr.dll
ramirr.inf
ramirr.sys

Ничего не напоминает?

Да и абстрактные знания подсказывают, что SetWinEventHook не позволяет произвольное рисование перехватывать.
-- Alex Fedotov
Re[6]: Отслеживать Draw везде (+)
От: Andrew S Россия http://alchemy-lab.com
Дата: 11.08.03 07:26
Оценка:
Алескандр, а в history изменений посмотреть не догадались? Почитайте
Миррор драйвер они не так давно сделали. У них там аж 3 ли 4 схемы перехвата. Причем каждая из них глючит по-своему. Например, миррор драйвер у них не работает на многих NT4. Из-за кривого минидрайвера.
А MSAA — так на нем же лупа от майкрософт работает. Все вполне корректно перехватывает.

AF>Хм. Скачал я этот RemotelyAnyWhere. Устанавливать не стал, посмотрел в дистрибутив:


AF>ramirr.dll

AF>ramirr.inf
AF>ramirr.sys

AF>Ничего не напоминает?


AF>Да и абстрактные знания подсказывают, что SetWinEventHook не позволяет произвольное рисование перехватывать.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[7]: Отслеживать Draw везде (+)
От: Alex Fedotov США  
Дата: 11.08.03 15:25
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Миррор драйвер они не так давно сделали. У них там аж 3 ли 4 схемы перехвата. Причем каждая из них глючит по-своему. Например, миррор драйвер у них не работает на многих NT4. Из-за кривого минидрайвера.

AS>А MSAA — так на нем же лупа от майкрософт работает. Все вполне корректно перехватывает.

Хоршо, поставим вопрос прямо, с помощью какого события в SetWinEventHook можно отследить рисование?
-- Alex Fedotov
Re[8]: Отслеживать Draw везде (+)
От: Andrew S Россия http://alchemy-lab.com
Дата: 11.08.03 18:28
Оценка:
Вскрытие magnify показывает, что необходимо перехватывать события начиная с EVENT_MIN до EVENT_MAX.
Особенно активно приходят события:

EVENT_SYSTEM_FOREGROUND
EVENT_SYSTEM_CAPTURESTART
EVENT_SYSTEM_CAPTUREEND
EVENT_SYSTEM_MOVESIZESTART
EVENT_SYSTEM_MOVESIZEEND
EVENT_SYSTEM_DRAGDROPSTART
EVENT_SYSTEM_DRAGDROPEND
EVENT_SYSTEM_MINIMIZESTART
EVENT_SYSTEM_MINIMIZEEND
EVENT_OBJECT_CREATE
EVENT_OBJECT_DESTROY
EVENT_OBJECT_SHOW
EVENT_OBJECT_HIDE
EVENT_OBJECT_REORDER
EVENT_OBJECT_FOCUS
EVENT_OBJECT_SELECTION
EVENT_OBJECT_STATECHANGE
EVENT_OBJECT_LOCATIONCHANGE
EVENT_OBJECT_NAMECHANGE
EVENT_OBJECT_PARENTCHANGE

и почти все остальные.

Собственно, код, добывающий область обновления (а точнее координаты ACC объекта) тут (почти) одинаков для всех них, так что все это должно быть проще, чем писать драйвер. Надеюсь, как получить координаты IAccessible объекта, расписывать не надо

AF>Хоршо, поставим вопрос прямо, с помощью какого события в SetWinEventHook можно отследить рисование?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[9]: Отслеживать Draw везде (+)
От: Alex Fedotov США  
Дата: 11.08.03 18:47
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Вскрытие magnify показывает, что необходимо перехватывать события начиная с EVENT_MIN до EVENT_MAX.


Слушай, я уже устал спорить. По-моему, совершенно очевидно, что произвольное рисование в произвольном окне так отследить нельзя. Я с удовольствием постою в стороне и посмотрю как наши competitors попробуют что-нибудь сделать через эти события.
-- Alex Fedotov
Re[10]: Отслеживать Draw везде (+)
От: Andrew S Россия http://alchemy-lab.com
Дата: 11.08.03 20:00
Оценка:
Александр, я и не собирался спорить, тем более с Вами. Всего лишь было сказано, что есть еще один способ. Этот способ вполне работоспособен (судя по качеству перехвата RemotelyAnywhere и тому, как работает magnify). Да, проблем тут немало, но большинство из них как то решается. Как точно — мне это тоже неинтересно, т.к. для меня проще было разобраться в примере mirror, чем заниматься разбором полетов с MSAA. Да, я тоже не вижу способа перехватить тут произвольное, как вы выразились, рисование. Но тем не менее magnify это как то делает. По крайней мере, минимально работающий код перехвата при помощи MSAA сделать можно достаточно быстро. Все зависит от задач.


AF>Слушай, я уже устал спорить. По-моему, совершенно очевидно, что произвольное рисование в произвольном окне так отследить нельзя. Я с удовольствием постою в стороне и посмотрю как наши competitors попробуют что-нибудь сделать через эти события.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[10]: Отслеживать Draw везде (+)
От: sev http://www.demoforge.com
Дата: 15.08.03 18:02
Оценка:
> Слушай, я уже устал спорить. По-моему, совершенно очевидно, что произвольное
> рисование в произвольном окне так отследить нельзя. Я с удовольствием постою в
> стороне и посмотрю как наши competitors попробуют что-нибудь сделать через эти
> события.

"Ба! Знакомые всё лица!"
Впору уже создавать клуб любителей mirror-драйверов
А athlontb можно посоветовать идти в направлении mirror driver'а,
если он хочет иметь 100% правильный результат, либо отказаться
от первоначальной затеи.

С уважением,
Евгений Суходолин
http://www.demoforge.com
Posted via RSDN NNTP Server 1.7 beta
Re[11]: Отслеживать Draw везде (+)
От: Alex Fedotov США  
Дата: 15.08.03 19:06
Оценка:
Здравствуйте, sev, Вы писали:

>> Слушай, я уже устал спорить. По-моему, совершенно очевидно, что произвольное

>> рисование в произвольном окне так отследить нельзя. Я с удовольствием постою в
>> стороне и посмотрю как наши competitors попробуют что-нибудь сделать через эти
>> события.

sev>"Ба! Знакомые всё лица!"

sev>Впору уже создавать клуб любителей mirror-драйверов

Клуб любителей можно устраивать где-то в другом месте. У нас тут клуб профессионалов.
-- Alex Fedotov
Re[12]: Отслеживать Draw везде (+)
От: sev http://www.demoforge.com
Дата: 15.08.03 20:50
Оценка:
sev>>"Ба! Знакомые всё лица!"
sev>>Впору уже создавать клуб любителей mirror-драйверов
> Клуб любителей можно устраивать где-то в другом месте. У нас тут клуб
> профессионалов.

Прошу прощения, если кого обидел.

Но мне очень крупно повезло, раз я наконец-то нашёл Клуб Профессионалов.
Грех не воспользоваться такой возможностью и не попросить помощи
в решении одной небольшой проблемки, которая уже достаточно долгое
время не даёт мне покоя Надеюсь, что для Профессионалов это будет
несложно.

Пишем мы тут на досуге драйверочек небольшой, и всё то в нём работает
замечательно — альфабленды разные, текстауты хитрые, браши всевозможные —
кроме одной простой вещи: под Windows 2000 при использовании off-screen
device bitmaps всё падает в синий экран при таких простых операциях, как,
например, вызов контекстного меню. А также при появлении tooltips и прочих
подобных окошек. Надо сказать, что под XP этот код работает чудесно.
Без DFB он чудесно работает и на Windows 2000. Как Профессионалы
решали эту проблему? Был бы очень признателен за дельный совет!
(сами-то мы любители, пока потыкались, но решение ещё не нашли)

С уважением,
Евгений Суходолин
http://www.demoforge.com
Posted via RSDN NNTP Server 1.7 beta
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.