如何在Vista Aero下以编程方式禁用窗口动画?

时间:2009-07-16 12:14:20

标签: delphi windows-vista aero

我的应用程序自动执行多个动态创建表单的屏幕截图。这在Windows XP下运行良好,但在Vista Aero下运行不佳。大多数表单在屏幕截图中显示为半透明。问题在于Aero的窗口动画。

如何在Delphi(2007+)程序中检查/禁用/启用此动画?

或作为替代方案:如何在制作屏幕截图之前确保表格正确显示?

4 个答案:

答案 0 :(得分:1)

禁用Aero会很遗憾 - 一般来说,改变用户对UI风格的选择并不是一个好主意。

您可以以另一种方式绘制表单。我想到的一件事是使用PaintTo方法将其绘制到画布上。 (事实上​​,如果你将表单的截图作为一种获取它的样子的方式,你可能根本不需要显示表单 - 用Visible创建它们设置为false并将它们绘制成位图。仅如果用户需要与他们互动,请显示他们。)

答案 1 :(得分:0)

您可以将清单资源添加到exe文件,以通知Vista您希望应用程序在没有Aero的情况下运行 http://www.google.be/search?q=vista+manifest+resource+delphi

答案 2 :(得分:0)

Shoban评论中的链接让我朝着正确的方向前进。快速检查显示VCL中的DwmApi包装器,并且它直接向前推进。这是我现在成功使用的代码:

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

答案 3 :(得分:0)

我试图解决相同的问题并找到了这个问题,但是想出了一个完全不同的解决方案。它不会禁用动画,但是可以使窗口消失而没有动画效果。

var oldWidth := Self.Width;
var oldHeight := Self.Height;
try
    if Visible and (Self.WindowState <> wsMinimized) then
    begin
        Self.BorderStyle := bsNone; // do this first
        Self.Width := 0;
        Self.Height := 0;
    end;

    //.. Do your screen capture here

finally
    if Visible and (Self.WindowState <> wsMinimized) then
    begin
        Self.BorderStyle := bsSizeable; // or whatever it was
        Width := oldWidth;
        Height := oldHeight;
    end;
end;

您也可以将X和Y的窗口移至-maxint,但我更好。