Проверка отображения приложения WinForms в визуальных стилях ОС

У нас есть устаревшее приложение WinForms, написанное во времена.NET 1.x, и может потребоваться изменить код, который проверяет, отображается ли приложение с визуальными стилями ОС, по причине, описанной ниже. Текущая функция, которая выполняет эту работу, выглядит следующим образом:

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 в этом коде - это класс, который содержит объявления P-Invoke для всех ссылочных функций и констант WinAPI.

В этом коде мы хотим избежать вызовов, не зависящих от платформы, поскольку они, похоже, несовместимы с последними выпусками платформы Mono. Есть ли лучший и более короткий способ проверить, что нам нужно, без собственных вызовов ОС? Было бы хорошо, если бы мы могли делать это исключительно с нативными классами.NET. Минимальная версия поддерживаемого.NET должна быть 2.0 или даже 3.5.

0 ответов

Другие вопросы по тегам