Надежный способ ожидания другого процесса Windows, чтобы перерисовать его главное окно - PullRequest
0 голосов
/ 18 июля 2010

Я перемещаю окно (принадлежащее другому процессу) вперед, чтобы сделать его снимок экрана. Я могу сделать это, используя SetForegroundWindow, однако эта функция возвращается немедленно. Другой процесс занимает много времени, чтобы перерисовать главное окно (что требует доступа к базе данных), поэтому я не могу быть уверен, что когда я делаю скриншот, окно полностью отображается. Иногда все, что я получаю на скриншоте - это контур целевого окна поверх любого окна, которое ранее было на переднем плане.

Есть ли надежный способ дождаться полной окраски окна другого процесса? Я подозреваю, что нет, но это стоит попробовать. Может быть, я могу отправить сообщение в окно, которое будет иметь такой эффект?

Примечание : язык реализации не важен, но мне нужно решение, использующее собственный API Windows, либо непосредственно из кода C / C ++, либо через P / Invoke (например, из C # или VB.NET). К сожалению, я не могу использовать какие-либо функции WinForms.

Ответы [ 2 ]

1 голос
/ 18 июля 2010

UpdateWindow перекрасит окно, если какая-то его часть нуждается в перекраске, а затем вернет.

0 голосов
/ 19 июля 2010

Я получаю хорошие результаты, используя следующую стратегию:

  1. Вызовите PrintWindow, чтобы преобразовать целевое окно в растровое изображение и отбросить результат.
  2. Вызовите SetForegroundWindow, чтобы вывести целевое окно на передний план (это также вызывает перерисовку, но перерисовка обычно быстрая, потому что синхронный WM_PRINTCLIENT уже заставил процесс отобразить данные, необходимые для рендеринга.)
  3. Сон на короткое время (10 мс)
  4. Сделайте скриншот, используя BitBlt
  5. Восстановить исходный Z-порядок целевого окна
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...