1

.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 である必要があります。

4

0 に答える 0