我的应用程序会自动截取几个动态创建的表单。这在 Windows XP 下运行良好,但在 Vista Aero 下运行不佳。大多数表单在屏幕截图中显示为半透明。问题出在 Aero 的窗口动画上。
如何从 Delphi (2007+) 程序中检查/禁用/启用此动画?
或者作为替代方案:如何在制作屏幕截图之前确保表单正确显示?
我的应用程序会自动截取几个动态创建的表单。这在 Windows XP 下运行良好,但在 Vista Aero 下运行不佳。大多数表单在屏幕截图中显示为半透明。问题出在 Aero 的窗口动画上。
如何从 Delphi (2007+) 程序中检查/禁用/启用此动画?
或者作为替代方案:如何在制作屏幕截图之前确保表单正确显示?
Shoban 评论中的链接将我引向了正确的方向。快速检查显示了 VCL 中 DwmApi 的包装器,然后它就直接前进了。这是我现在成功使用的代码:
uses DwmApi;
...
SaveDwmCompositionEnabled := DwmCompositionEnabled;
if SaveDwmCompositionEnabled then
DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);
...
if SaveDwmCompositionEnabled then
DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);
禁用 Aero 将是一个遗憾 - 通常,更改用户对 UI 样式的选择不是一个好主意。
您也许可以用另一种方式绘制表格。想到的一件事是使用PaintTo方法将其绘制到画布上。(事实上,如果您将表单的屏幕截图作为获得外观的一种方式,您可能根本不需要显示表单 - 创建它们时将 Visible 设置为 false 并将它们绘制为位图。仅如果用户需要与他们交互,请向他们展示。)
我试图解决同样的问题并找到了这个问题,但想出了一个完全不同的解决方案。它不会禁用动画,但它允许您使窗口消失而没有动画效果。
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;
您也可以将窗口移动到-maxint
X 和 Y,但我更喜欢这个。
您可以向 exe 文件添加清单资源,以通知 Vista 您希望应用程序在没有 Aero 的情况下运行 http://www.google.be/search?q=vista+manifest+resource+delphi