2010-07-18 2 views
0

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

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

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

ответ

0

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

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

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

+0

я до сих пор с той же проблемой. 'UpdateWindow' возвращается слишком рано, пока картина не будет завершена. – finnw

+0

@finnw: Я думаю, что после 'UpdateWindow', я бы назвал' WaitForInputIdle' и посмотрел, делает ли это трюк. Я раньше не использовал 'WaitForInputIdle', поэтому я не могу гарантировать, что это будет эффективно, но я бы предположил, что есть хотя бы довольно хороший шанс ... –

+1

@Jerry Coffin IIRC WaitForInputIdle работает только тогда, когда процесс запускается. – Anders

Смежные вопросы