Проверка отображения приложения 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.