From 2c27fba92296ff54bde425fb7d3bd1baa844eb86 Mon Sep 17 00:00:00 2001 From: Yimeng Wu Date: Wed, 29 Jul 2020 00:29:58 +0800 Subject: [PATCH] OS version check without requiring app.manifest --- ModernWpf/Helpers/ColorsHelper.cs | 7 +++--- ModernWpf/Helpers/OSVersionHelper.cs | 35 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 ModernWpf/Helpers/OSVersionHelper.cs diff --git a/ModernWpf/Helpers/ColorsHelper.cs b/ModernWpf/Helpers/ColorsHelper.cs index 4692b257..94968d58 100644 --- a/ModernWpf/Helpers/ColorsHelper.cs +++ b/ModernWpf/Helpers/ColorsHelper.cs @@ -1,10 +1,9 @@ -using ModernWpf.Media.ColorPalette; -using System; +using System; using System.Collections; -using System.Diagnostics; using System.Runtime.CompilerServices; using System.Windows; using System.Windows.Media; +using ModernWpf.Media.ColorPalette; using Windows.UI.ViewManagement; namespace ModernWpf @@ -35,7 +34,7 @@ private ColorsHelper() } } - public static bool SystemColorsSupported { get; } = Environment.OSVersion.Version.Major >= 10; + public static bool SystemColorsSupported { get; } = OSVersionHelper.IsWindows10; public static ColorsHelper Current { get; } = new ColorsHelper(); diff --git a/ModernWpf/Helpers/OSVersionHelper.cs b/ModernWpf/Helpers/OSVersionHelper.cs new file mode 100644 index 00000000..9cb6077a --- /dev/null +++ b/ModernWpf/Helpers/OSVersionHelper.cs @@ -0,0 +1,35 @@ +using System; +using System.Runtime.InteropServices; + +namespace ModernWpf +{ + internal static class OSVersionHelper + { + internal static bool IsWindowsNT { get; } = Environment.OSVersion.Platform == PlatformID.Win32NT; + + internal static bool IsWindows10 { get; } = IsWindowsNT && IsWindows10Impl(); + + private static bool IsWindows10Impl() + { + var osv = new RTL_OSVERSIONINFOEX(); + osv.dwOSVersionInfoSize = (uint)Marshal.SizeOf(osv); + int ret = RtlGetVersion(out osv); + return ret == 0 && osv.dwMajorVersion >= 10; + } + + [DllImport("ntdll.dll")] + private static extern int RtlGetVersion(out RTL_OSVERSIONINFOEX lpVersionInformation); + + [StructLayout(LayoutKind.Sequential)] + private struct RTL_OSVERSIONINFOEX + { + internal uint dwOSVersionInfoSize; + internal uint dwMajorVersion; + internal uint dwMinorVersion; + internal uint dwBuildNumber; + internal uint dwPlatformId; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] + internal string szCSDVersion; + } + } +}