在pre-vista上使用dwmiscompostionenabled (JwaDwmApi)会导致错误



尝试使用以下代码来检查Windows Aero是否启用:

function AeroEnabled: boolean;
var
  enabled: bool;
begin
 // Function from the JwaDwmapi unit (JEDI Windows Api Library)
 DwmIsCompositionEnabled(enabled);
 Result := enabled;
end;
 ...
 if (CheckWin32Version(5,4)) and (AeroEnabled) then
 CampaignTabs.ColorBackground   := clBlack
 else begin
 GlassFrame.Enabled             := False;
 CampaignTabs.ColorBackground   := clWhite;
 end;

但是,在vista之前的机器上这样做会导致应用程序崩溃,因为DWMApi.dll缺失。我也尝试过这个代码,但是它连续产生2个AV。我该怎么做呢?我使用Delphi 2010。:)

你的版本错了。Vista/2008服务器是6.0版本。你的测试应该是:

CheckWin32Version(6,0)

我相信你正在使用Delphi 2010或更高版本,在这种情况下,你应该简单地从内置的Dwmapi单元调用DwmCompositionEnabled函数。这将为您组织版本检查和延迟绑定。不需要绝地武士。


编辑:下面的文字是在编辑问题之前写的。

可能最简单的方法是检查Windows版本。你需要Win32MajorVersion>=6(即Vista或2008服务器),以调用DwmIsCompositionEnabled

如果你正在绑定自己,那么你会调用LoadLibraryDWMApi.dll,如果成功,那么你会调用GetProcAddress来绑定。如果成功了,你就很好。但是,正如我说过的,既然你自己不处理绑定,那么版本检查可能是最简单的。

所以函数是:

function AeroEnabled: boolean;
var
  enabled: bool;
begin
  if Win32MajorVersion>=6 then begin
    DwmIsCompositionEnabled(enabled);
    Result := enabled;
  end else begin
    Result := False;
  end;
end;

注意,我假设你的库正在进行后期绑定,即显式链接。如果没有,那么你将需要LoadLibrary/GetProcAddress,就像在@RRUZ的代码中所做的那样。

相关内容

  • 没有找到相关文章

最新更新