.NET 1.x の時点で記述された従来の WinForms アプリがあり、以下に説明する理由により、アプリが OS ビジュアル スタイルでレンダリングされているかどうかを確認するコードを変更する必要がある場合があります。この作業を行う現在の関数は次のようになります。
private bool IsComCtl6
{
get
{
if (!fIsComCtl6Initialized)
{
IntPtr hMod = NativeMethods.LoadLibrary("comctl32.dll");
if (hMod != IntPtr.Zero)
{
IntPtr lptrDLLVersion = NativeMethods.GetProcAddress(hMod, "DllGetVersion");
if (lptrDLLVersion != IntPtr.Zero)
{
hMod = NativeMethods.LoadLibrary("uxtheme.dll");
if (hMod != IntPtr.Zero)
{
NativeMethods.DllVersionInfo dvi = new NativeMethods.DllVersionInfo();
dvi.cbSize = Marshal.SizeOf(typeof(NativeMethods.DllVersionInfo));
if (NativeMethods.DllGetVersion(ref dvi) == NativeMethods.S_OK)
fIsComCtl6 = (!fCheckAppThemed || dvi.dwMajorVersion >= 6) && NativeMethods.IsThemeActive() && NativeMethods.IsAppThemed();
}
}
}
fIsComCtl6Initialized = true;
}
return fIsComCtl6;
}
}
このコードの NativeMethods は、参照されるすべての WinAPI 関数と定数の P-Invoke 宣言を含むクラスです。
このコードでは、プラットフォームに依存しない呼び出しを避けたいと考えています。これは、Mono プラットフォームの最新リリースと互換性がないように思われるためです。OS ネイティブ呼び出しなしで必要なものを確認するためのより良い、より短い方法はありますか? ネイティブの .NET クラスだけでそれができればいいのですが。サポートされている .NET の最小バージョンは 2.0 または 3.5 である必要があります。