【问题标题】:How to programmatically disable window animation under Vista Aero?如何在 Vista Aero 下以编程方式禁用窗口动画?
【发布时间】:2010-11-11 08:23:37
【问题描述】:

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

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

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

【问题讨论】:

  • 不是delphi,但我们在这里有类似的问题stackoverflow.com/questions/280480/…
  • 感谢您的提示 - 让我在 VCL 中搜索了一下,直到我发现:一如既往,Delphi 有一个 DWMApi 的实现,结果证明事情就像设置一个布尔属性一样简单。
  • 我没有说它“是”一个属性——我说它“就像设置一个属性一样简单”。
  • 你能给我们这些试图解决同样问题的人一个提示吗?
  • 下面几行 - 看看我对自己问题的回答。

标签: delphi windows-vista aero


【解决方案1】:

Shoban 评论中的链接将我引向了正确的方向。快速检查显示了 VCL 中 DwmApi 的包装器,然后它就直接前进了。这是我现在成功使用的代码:

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

【讨论】:

  • 我真的不喜欢这个解决方案;禁用桌面合成不是我希望其他发现此问题的人做的事情。我假设动画时间在系统中是可配置的,但假设它是 200 毫秒。在 OnShow 期间启动一个 200 毫秒的计时器,然后进行截图。如果 OnClose 触发时计时器仍在运行,则截屏。
  • 确实有这个可能。 Althoug,在我的情况下我不会这样做,因为它会增加很多使用的时间,只是因为要截取的截图数量。但至少这是一种选择。
【解决方案2】:

禁用 Aero 会很遗憾 - 通常,更改用户对 UI 样式的选择不是一个好主意。

您也许可以用另一种方式绘制表格。想到的一件事是使用PaintTo 方法将其绘制到画布上。 (事实上​​,如果您将表单的屏幕截图作为获得外观的一种方式,您可能根本不需要显示表单 - 创建它们时将 Visible 设置为 false 并将它们绘制到位图上。仅如果用户需要与他们互动,请向他们展示。)

【讨论】:

  • 屏幕截图是在自动构建期间拍摄的。所以用户根本不会打扰。但是使用 PaintTo 的想法听起来很有趣……
【解决方案3】:

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

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,但我更喜欢这个。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多