【问题标题】:Using DwmIsCompositionEnabled (JwaDwmApi) on pre-vista causes error在 pre-vista 上使用 DwmIsCompositionEnabled (JwaDwmApi) 会导致错误
【发布时间】:2011-09-24 15:04:52
【问题描述】:

一直在尝试使用以下代码来检查是否启用了 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;

但是,在 pre-vista 机器上这样做会导致应用程序崩溃,因为 DWMApi.dll 丢失。我也尝试过this code,但它会连续产生 2 个 AV。我怎样才能做到这一点 ?我正在使用 Delphi 2010。:)

【问题讨论】:

    标签: delphi aero dwm jedi-code-library


    【解决方案1】:

    您的版本有误。 Vista/2008 服务器是 6.0 版。你的测试应该是:

    CheckWin32Version(6,0)
    

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


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

    可能最简单的方法是检查 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 的代码中所做的那样。

    【讨论】:

      猜你喜欢
      • 2017-12-16
      • 1970-01-01
      • 2013-05-31
      • 2018-08-08
      • 2017-12-22
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 2018-11-12
      相关资源
      最近更新 更多