2010-07-22 6 views
3

Мое приложение имеет возможность отключить аэро, вызывая DwmEnableComposition (0) перед тем, как захватить изображение на экране. Как вы знаете, отключение аэро делает экран черным, а затем возвращается в нормальное состояние. На разных ПК это может занять от 2 до 3 секунд в зависимости от того, насколько быстро система.Подождите, пожалуйста, отключите aero

Есть ли лучший способ определить, полностью ли отключено aero перед захватом экрана, а не Thread.Sleep()?

ответ

1

Событие Paint вашей формы будет запущено. Это не означает, что все окна будут полностью окрашены, но вы можете спать меньше. Прослушивание сообщения уведомления путем переопределения WndProc() может работать, но не обязательно, когда оно отправлено. WM_DWMCOMPOSITIONCHANGED - это сообщение 0x31e. Я подозреваю, что он будет отправлен слишком рано, все окна, вероятно, придется перекрашивать дальше. Единственный способ убедиться в том, чтобы перечислить окна с EnumWindows и вызвать UpdateWindow. Посетите pinvoke.net для объявлений P/Invoke, которые вам понадобятся. Sleep() тоже будет работать, но нет возможности угадать количество, которое гарантировано для работы повсюду.

+0

WM_DWMCOMPOSITIONCHANGED на WndProc не гарантирует, что aero полностью отключен. Части экрана по-прежнему черные. – sjlewis

+0

Дело не в том, что Aero еще не отключен, потому что у окон еще нет возможности перекрасить себя. Сообщение обновлено. –

2

Вы должны быть в состоянии сделать это, используя соответствующую функцию API DwmIsCompositionEnabled. Другим вариантом может быть прослушивание события WM_DWMCOMPOSITIONCHANGED.

+0

Я уже проверяю DwmIsCompositionEnabled на цикл после отключения аэра, но захват экрана по-прежнему идет до того, как aero полностью отключен, поэтому я получаю черные изображения. Я попробую WM_DWMCOMPOSITIONCHANGED – sjlewis

1

Вы изучали DwmIsCompositionEnabled? На этой странице также говорится, что приложения могут прослушивать изменения состояния композиции, обрабатывая уведомление WM_DWMCOMPOSITIONCHANGED.