我的应用程序自动执行多个动态创建表单的屏幕截图。这在Windows XP下运行良好,但在Vista Aero下运行不佳。大多数表单在屏幕截图中显示为半透明。问题在于Aero的窗口动画。
如何在Delphi(2007+)程序中检查/禁用/启用此动画?
或作为替代方案:如何在制作屏幕截图之前确保表格正确显示?
答案 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
,但我更好。