Подождите, пока отключить Aero для завершения - PullRequest
3 голосов
/ 22 июля 2010

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

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

Ответы [ 3 ]

2 голосов
/ 22 июля 2010

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

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

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

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

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

...