如何使用Delphi 2010以编程方式确定Windows的性能设置

The*_*ven 2 windows delphi winapi delphi-2010

以下代码是关闭我的应用程序.

procedure TfrmMain.btnClose1Click(Sender: TObject);
var
  i : Integer;
begin
  for i := 255 downto 0 do begin
    frmMain.AlphaBlendValue := i;
    application.ProcessMessages;
  end;

  Close;
end;
Run Code Online (Sandbox Code Playgroud)

将Windows性能设置为"让Windows选择......"

  • 当使用上面的代码关闭我的Delphi应用程序时,淡入淡出几乎是瞬间的(最多可能是1/4秒,如果我眨眼,我会错过过渡).

如果我将性能选项设置为"调整以获得最佳性能"

  • 退出同一个应用程序时,淡入淡出需要12秒.
  • 使用相同的代码但注释掉AlphaBlendValue更改会消除延迟.

我在Delphi 2010和DelphiXE2上测试了这个,结果是一样的.这在Windows 7 Ultimate 64bit上进行了测试,如果这有任何区别的话.

至少可以说这种行为让我很困惑.

  • 我认为Alpha属性的形式由GPU处理,因此不会受到旨在最大化CPU性能的Windows性能设置的影响.

因此,就这一点而言,我不确定这是一个Windows 7错误,Delphi错误还是我缺乏知识.

至于修复...有没有办法判断Windows是否在垃圾图形/最大性能模式下运行,以便我可以在我的应用程序中禁用Alpha淡入淡出效果?


为清晰起见编辑:虽然我想修复淡入淡出我真正想要的是一种确定Windows性能设置的方法.

我正在寻找如何确定特定的Windows设置 - 当您进入Windows性能选项时,有3个选项卡.在第一个"视觉效果"选项卡上,有3个固定选项和第4个"自定义"选项.最小的我试图确定所选的选项是否是"调整以获得最佳性能",如果我可以更好地确定此选项卡上的设置.


感谢任何帮助.

Dav*_*nan 7

您的代码的根本问题在于,无论机器的性能特征如何,您都在强制进行256次不同的更新.您不必使用255和0之间的每个alpha混合值.您可以跳过某些值并仍然具有平滑淡入淡出.

您需要考虑机器的实际图形性能.由于您无法预测,您应该在淡入淡出代码中考虑实时.无论机器的性能特性如何,这样做都能为您提供一致的褪色速率.

所以,这是一个简单的例子来演示将淡入淡出率与实时联系起来:

procedure TfrmMain.btnClose1Click(Sender: TObject);
var
  Stopwatch: TStopwatch;
  NewAlphaBlendValue: Integer;
begin
  Stopwatch := TStopwatch.StartNew;
  while True do
  begin
    NewAlphaBlendValue := 255-(Stopwatch.ElapsedMilliseconds div 4);
    if NewAlphaBlendValue>0 then
      AlphaBlendValue := NewAlphaBlendValue
    else
      break;
  end;
  Close;
end;
Run Code Online (Sandbox Code Playgroud)

褪色持续时间为1秒.您可以随时调整数学,以根据您的要求修改持续时间.即使在低性能机器上,此代码也会产生平滑的淡入淡出效果.

我还要评论你不应该drmMainTfrmMain方法中使用全局变量.该TfrmMain方法已经可以访问该实例.是的Self.当然你可以省略Self.更ProcessMessages糟糕的呼吁是坏的.这允许重新处理排队的输入消息.你不希望这种情况发生.所以删除对的呼叫ProcessMessages.


您实际上询问有关检测调整以获得最佳性能的设置.但我认为那是错误的问题.首先,您应该修复淡入淡出代码,以使淡入淡出持续时间与图形性能无关.

完成后,如果用户要求较低质量的外观设置,您可能仍希望禁用淡入淡出.我认为你不应该寻找你提到的3个罐装选项中的一个.它们很可能是特定于Windows版本的.我个人会在最小化和最大化设置将行为基于Animate窗口.我的理由是,如果用户不希望最小化和最大化动画,那么可能他们不希望窗口接近褪色.

以下是如何阅读该设置:

function GetWindowAnimation: Boolean;
var
  AnimationInfo: TAnimationInfo;
begin
  AnimationInfo.cbSize := SizeOf(AnimationInfo);
  if not SystemParametersInfo(SPI_GETANIMATION, AnimationInfo.cbSize,
      @AnimationInfo, 0) then
    RaiseLastOSError;
  Result := AnimationInfo.iMinAnimate<>0;
end;
Run Code Online (Sandbox Code Playgroud)

我认为您可能还会阅读大多数您可能关注的其他设置SystemParametersInfo.您应该能够通过遵循文档来了解如何执行此操作.