0

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が見つからないため、アプリがクラッシュします。私もこのコードを試しましたが、2つのAVが連続して生成されます。これどうやってするの ?私はDelphi2010を使用しています。:)

4

1 に答える 1

5

バージョンが間違っています。Vista/2008サーバーはバージョン6.0です。テストは次のようになります。

CheckWin32Version(6,0)

Delphi 2010以降を使用していると思います。その場合はDwmCompositionEnabled、組み込みDwmapiユニットから関数を呼び出すだけです。これにより、バージョンチェックと遅延バインディングが整理されます。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;

注意してください、私はあなたのライブラリが遅延バインディング、すなわち明示的なリンクを行っていると仮定しています。そうでない場合は、リンク先の@RRUZのコードで行われているのとまったく同じように、LoadLibrary/GetProcAddressが必要になります。

于 2011-09-24T15:10:36.487 に答える