Как определить, когда содержимое окна изменилось - PullRequest
2 голосов
/ 25 октября 2010

Мне нужно написать скринкаст и определить, когда содержимое окна изменилось, даже был выбран только текст. Это окно стороннего контроля.

1 Ответ

5 голосов
/ 25 октября 2010

Есть несколько методов.

(1) Экран опроса.

Вы можете опросить экран (то есть создать DIB, каждый период времени до BitBlt с экрана на него), а затем отправить его как есть

Плюсы:

  • Очень просто реализовать

Минусы:

  • Высокая загрузка процессора. Опрос по всему экрану количество раз в секунду очень тяжелый (необходимо передать много данных). Следовательно, он будет тяжелым и медленным.
  • Высокая пропускная способность сети

(2) То же, что и выше, за исключением того, что теперь вы анализируете экран опроса, чтобы увидеть разницу. Затем вы можете отправлять только различия (и, очевидно, ничего не отправлять, если нет изменений), плюс вы можете дополнительно сжать поток различий.

Плюсы:

  • Все еще не слишком сложно реализовать
  • значительно меньшая пропускная способность сети

Минусы:

  • Еще более высокая загрузка процессора.

(3) То же, что и выше, за исключением того, что вы не опрашиваете экран постоянно. Вместо этого вы делаете перехват для вашего элемента управления (например, шпионаж для сообщений Windows, которые получает элемент управления). Затем вы попытаетесь узнать, когда ваш элемент управления должен сам себя перерисовать, и выполните опрос экрана только в этих сценариях.

Плюсы:

  • Значительно ниже загрузка процессора
  • Все еще приемлемая пропускная способность сети

Минусы:

  • Реализация становится сложной. Такие вещи, как инъекционные крючки и т. Д.
  • Поскольку это основано на некоторой эвристике - вам не гарантировано (вообще говоря) охватывать все возможные сценарии. В некоторых случаях вы можете пропустить изменения.
* +1055 * (4) Крюк на более низком уровне: перехватывать вызовы функций рисования. Поскольку в пользовательском режиме таких функций огромное количество, единственная реальная возможность сделать это - в режиме ядра.

Вы можете написать виртуальный видеодрайвер (либо «зеркальный» видеодрайвер, либо подключить существующий), чтобы получить все чертежи в системе. Затем, когда вы получите запрос на рисование в определенной области - вы узнаете, что он изменился.

Плюсы:

  • Снижение загрузки процессора.
  • 100% гарантия перехвата всех чертежей без эвристики
  • Несколько чище - не нужно вводить хуки в приложения / элементы управления

Минусы:

  • Это разработка драйвера ! Если вы не испытали это - это настоящий кошмар.
  • Более сложная установка. Требуются права администратора, скорее всего, требуется перезагрузка.
  • Все еще значительная загрузка процессора и пропускная способность

(5) Продолжаем разработку драйверов. Пока вы знаете, какие функции рисования вызываются, вы можете изменить стратегию сейчас. Вместо того, чтобы «запоминать» грязные области и опрашивать экран там - вы можете просто «запомнить» функцию рисования, вызванную со всеми параметрами, а затем «повторить» ее на стороне хоста.

Таким образом, вам вообще не нужно опрашивать экран. Вы работаете в "векторном" методе (в отличие от "растрового").

Однако это гораздо сложнее реализовать. Некоторые функции рисования принимают в качестве параметров другие растровые изображения, которые, в свою очередь, рисуются с использованием других функций рисования и т. Д. Вам придется следить за растровыми изображениями, а также за экраном.

Плюсы:

  • Нулевая загрузка процессора
  • Наилучший возможный сетевой трафик
  • Гарантированно работать всегда

Минусы:

  • Это разработка драйвера в лучшем виде! Месяцы разработки гарантированы
  • Требуется современное программирование, глубокое понимание 2D-рисунка
  • Необходимо написать код на хосте, который будет «рисовать» все «записанные» команды.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...