2009-07-16 2 views
4

Мое приложение выполняет автоматические скриншоты нескольких динамически созданных форм. Это отлично работает под Windows XP, но не работает хорошо под Vista Aero. Большинство форм выглядят полупрозрачными на снимках экрана. Проблема заключается в анимации окна Aero.Как программно отключить анимацию окон под Vista Aero?

Как я могу проверить/отключить эту анимацию из программы Delphi (2007+)?

Или как альтернатива: как я могу убедиться, что форма отображается правильно, прежде чем делать снимок экрана?

+3

Не Дельфи, но у нас есть аналогичный вопрос здесь http://stackoverflow.com/questions/280480/enabling-disabling-aero-from-a-windows-service – Shoban

+0

Спасибо за подсказку - заставил меня искать внутри VCL немного, пока не нашел: Как всегда, у Delphi есть реализация DWMApi, и все оказалось так же просто, как установка булевского свойства. –

+0

Что это за собственность? –

ответ

0

Ссылка в комментарии от Shoban привела меня в правильном направлении. Быстрая проверка показала обертку для DwmApi в VCL и от того, что она прошла прямо. Вот код, который я успешно использую сейчас:

uses DwmApi; 
... 
    SaveDwmCompositionEnabled := DwmCompositionEnabled; 
    if SaveDwmCompositionEnabled then 
    DwmEnableComposition(DWM_EC_DISABLECOMPOSITION); 
... 
    if SaveDwmCompositionEnabled then 
    DwmEnableComposition(DWM_EC_ENABLECOMPOSITION); 
+1

Мне действительно не нравится это решение; отключение Desktop Composition - это не то, что я хотел бы, чтобы кто-то еще нашел этот вопрос. Я предполагаю, что время анимации настраивается в системе, но предположим, что это 200 мс. Затем запустите таймер 200 мс во время OnShow, чтобы сделать снимок экрана. Если таймер все еще работает, когда OnClose срабатывает, тогда сделайте снимок экрана. –

+0

Это действительно возможность. Althoug, я бы не сделал этого в моем случае, так как это увеличило бы время, используемое много, просто из-за числа сдвига на снимках экрана. Но, по крайней мере, это вариант. –

1

Отключение Aero будет жаль - в общем, это не очень хорошая идея, чтобы изменить пользователя выбор стиля пользовательского интерфейса.

Возможно, вы сможете нарисовать форму другим способом. Одна вещь, которая приходит на ум, - использовать метод PaintTo, чтобы нарисовать его на холсте. (Фактически, если вы делаете скриншоты форм как способ получить то, на что похоже, вам, вероятно, вообще не нужно отображать формы, создавали их с помощью Visible set false и рисовали их в растровое изображение. покажите им, если пользователь должен взаимодействовать с ними.)

+0

Скриншоты сделаны во время автоматической сборки. Таким образом, пользователь вообще не будет беспокоиться. Но идея с использованием PaintTo звучит интересно ... –