Надо отслеживать тот факт, что в любом окне, принадлежащем любому из запущенных приложений,
произошло изменение его графического вида, будь то изменение текста на кнопке либо что-то
другое. Причем необходимо знать, в каком конкретном окне это произошло, например hwnd кнопки.
Здравствуйте, 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.
Здравствуйте, 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* в самом драйвере.
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.
Здравствуйте, 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, а на другие сообщения: мышиные, клавиатурные, таймер.
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.
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.
>>а по поводу хуков вообще — многие компоненты сейчас рисуют вообще из ядра ? >>(например, это AnimateWindow, т.е. все fade-in menu, заголовки, сворачивающиеся в >>таскбар и т.п.)
Да, все так и вышло... очень многое не ловится, особенно в нестандартных приложениях.
Придется рюхать...
Если у кого есть код на тему mirror display driver, подкиньте.
А почему бы не попробовать через MSAA (SetWinEventHook)?
Вполне работоспособно, судя по RemotelyAnyWhere и многим другим программам.
И проблем меньше. На первый взгляд.
AF>>А вот это нет. EngCreateWnd позволяет отслеживать положение и размеры окна, но ни как не изменения в его содержимом. Чтобы отслеживать изменения изображения, надо обрабатывать функции рисования Drv* в самом драйвере. V>тоже верно, спасибо за уточнение: у себя делал все вместе некоторое время назад, уже забывается... V>действительно без перехвата DDI не обойтись, впрочем это даже легче наверное, чем возиться с WNDOBJ_xxx
Здравствуйте, Andrew S, Вы писали:
AS>А почему бы не попробовать через MSAA (SetWinEventHook)?
AS>Вполне работоспособно, судя по RemotelyAnyWhere и многим другим программам.
Хм. Скачал я этот RemotelyAnyWhere. Устанавливать не стал, посмотрел в дистрибутив:
ramirr.dll
ramirr.inf
ramirr.sys
Ничего не напоминает?
Да и абстрактные знания подсказывают, что SetWinEventHook не позволяет произвольное рисование перехватывать.
Алескандр, а в history изменений посмотреть не догадались? Почитайте
Миррор драйвер они не так давно сделали. У них там аж 3 ли 4 схемы перехвата. Причем каждая из них глючит по-своему. Например, миррор драйвер у них не работает на многих NT4. Из-за кривого минидрайвера.
А MSAA — так на нем же лупа от майкрософт работает. Все вполне корректно перехватывает.
AF>Хм. Скачал я этот RemotelyAnyWhere. Устанавливать не стал, посмотрел в дистрибутив:
AF>ramirr.dll AF>ramirr.inf AF>ramirr.sys
AF>Ничего не напоминает?
AF>Да и абстрактные знания подсказывают, что SetWinEventHook не позволяет произвольное рисование перехватывать.
Здравствуйте, Andrew S, Вы писали:
AS>Миррор драйвер они не так давно сделали. У них там аж 3 ли 4 схемы перехвата. Причем каждая из них глючит по-своему. Например, миррор драйвер у них не работает на многих NT4. Из-за кривого минидрайвера. AS>А MSAA — так на нем же лупа от майкрософт работает. Все вполне корректно перехватывает.
Хоршо, поставим вопрос прямо, с помощью какого события в SetWinEventHook можно отследить рисование?
Собственно, код, добывающий область обновления (а точнее координаты ACC объекта) тут (почти) одинаков для всех них, так что все это должно быть проще, чем писать драйвер. Надеюсь, как получить координаты IAccessible объекта, расписывать не надо
AF>Хоршо, поставим вопрос прямо, с помощью какого события в SetWinEventHook можно отследить рисование?
Здравствуйте, Andrew S, Вы писали:
AS>Вскрытие magnify показывает, что необходимо перехватывать события начиная с EVENT_MIN до EVENT_MAX.
Слушай, я уже устал спорить. По-моему, совершенно очевидно, что произвольное рисование в произвольном окне так отследить нельзя. Я с удовольствием постою в стороне и посмотрю как наши competitors попробуют что-нибудь сделать через эти события.
Александр, я и не собирался спорить, тем более с Вами. Всего лишь было сказано, что есть еще один способ. Этот способ вполне работоспособен (судя по качеству перехвата RemotelyAnywhere и тому, как работает magnify). Да, проблем тут немало, но большинство из них как то решается. Как точно — мне это тоже неинтересно, т.к. для меня проще было разобраться в примере mirror, чем заниматься разбором полетов с MSAA. Да, я тоже не вижу способа перехватить тут произвольное, как вы выразились, рисование. Но тем не менее magnify это как то делает. По крайней мере, минимально работающий код перехвата при помощи MSAA сделать можно достаточно быстро. Все зависит от задач.
AF>Слушай, я уже устал спорить. По-моему, совершенно очевидно, что произвольное рисование в произвольном окне так отследить нельзя. Я с удовольствием постою в стороне и посмотрю как наши competitors попробуют что-нибудь сделать через эти события.
> Слушай, я уже устал спорить. По-моему, совершенно очевидно, что произвольное > рисование в произвольном окне так отследить нельзя. Я с удовольствием постою в > стороне и посмотрю как наши competitors попробуют что-нибудь сделать через эти > события.
"Ба! Знакомые всё лица!"
Впору уже создавать клуб любителей mirror-драйверов
А athlontb можно посоветовать идти в направлении mirror driver'а,
если он хочет иметь 100% правильный результат, либо отказаться
от первоначальной затеи.
Здравствуйте, sev, Вы писали:
>> Слушай, я уже устал спорить. По-моему, совершенно очевидно, что произвольное >> рисование в произвольном окне так отследить нельзя. Я с удовольствием постою в >> стороне и посмотрю как наши competitors попробуют что-нибудь сделать через эти >> события.
sev>"Ба! Знакомые всё лица!" sev>Впору уже создавать клуб любителей mirror-драйверов
Клуб любителей можно устраивать где-то в другом месте. У нас тут клуб профессионалов.
sev>>"Ба! Знакомые всё лица!" sev>>Впору уже создавать клуб любителей mirror-драйверов > Клуб любителей можно устраивать где-то в другом месте. У нас тут клуб > профессионалов.
Прошу прощения, если кого обидел.
Но мне очень крупно повезло, раз я наконец-то нашёл Клуб Профессионалов.
Грех не воспользоваться такой возможностью и не попросить помощи
в решении одной небольшой проблемки, которая уже достаточно долгое
время не даёт мне покоя Надеюсь, что для Профессионалов это будет
несложно.
Пишем мы тут на досуге драйверочек небольшой, и всё то в нём работает
замечательно — альфабленды разные, текстауты хитрые, браши всевозможные —
кроме одной простой вещи: под Windows 2000 при использовании off-screen
device bitmaps всё падает в синий экран при таких простых операциях, как,
например, вызов контекстного меню. А также при появлении tooltips и прочих
подобных окошек. Надо сказать, что под XP этот код работает чудесно.
Без DFB он чудесно работает и на Windows 2000. Как Профессионалы
решали эту проблему? Был бы очень признателен за дельный совет!
(сами-то мы любители, пока потыкались, но решение ещё не нашли)