如何使用C# 4.0检测Windows 8操作系统?

23

我需要在我的 C# Windows 应用程序中检测 Windows 8 操作系统并执行一些设置。我知道可以使用 Environment.OSVersion 检测 Windows 7,但是如何检测 Windows 8 呢?

提前感谢。


13
你尝试使用Environment.OSVersion并检查它在Windows 8上的输出了吗? - Jon Skeet
它打印了Microsoft Windows NT 6.2.9200.0。 - Rajesh Subramanian
11
那么你不能使用那个吗? - Jon Skeet
谢谢。好想法。我会使用它。 - Rajesh Subramanian
你考虑过哪个答案适合你吗?如果你接受了那个答案会很好。 - AgentFire
5个回答

34
Version win8version = new Version(6, 2, 9200, 0);

if (Environment.OSVersion.Platform == PlatformID.Win32NT &&
    Environment.OSVersion.Version >= win8version)
{
    // its win8 or higher.
}

更新Windows 8.1及更高版本:

好的,各位,似乎微软已经将这段代码标记为已弃用。我在这里留下一个链接,让你们能够了解更多信息。

简而言之,它说:

对于Windows 8及更高版本,始终会有相同版本号的(6,2,9200,0)。而不是寻找Windows版本,请寻找您正在尝试解决的实际功能的存在。


2
在我的Windows Store应用程序中,找不到OSVersion,找不到Environment.OSVersion,也找不到PlatformID。因此,对于Windows Store应用程序,这将无法工作。糟糕。 - Tertium
2
@Tertium,问题中没有Windows Store标签。 - AgentFire
OSVersion.Platform 应该改为 Environment.OSVersion.Platform。 - theJerm
1
请注意,在Windows 10上会返回与Windows 8相同的结果。 - superjos
@superjos 是什么意思(6, 2, 9200, 0)? - AgentFire
@AgentFire 是的,就是这样 - superjos

13

Windows 8或更新版本:

bool IsWindows8OrNewer()
{
    var os = Environment.OSVersion;
    return os.Platform == PlatformID.Win32NT && 
           (os.Version.Major > 6 || (os.Version.Major == 6 && os.Version.Minor >= 2));
}

应该是:返回 os.Platform == PlatformID.Win32NT && (os.Version.Major > 6 || (os.Version.Major == 6 && os.Version.Minor >= 2)); - Charlie
为什么不直接使用Version结构体的>、<、==、<=等运算符呢? - AgentFire
2
因为我在回答时不知道这些内容,而你很快就提供了一个使用这些内容的答案。你的答案更好,但我把我的留作另一种选择。 - Asik

3

请查看以下问题的答案:如何获取“友好”的操作系统版本名称?

引用的答案:

您可以使用WMI获得产品名称(“Microsoft® Windows Server® 2008 Enterprise”):

using System.Management;
var name = (from x in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get().OfType<ManagementObject>() select x.GetPropertyValue("Caption")).First();
return name != null ? name.ToString() : "Unknown";

4
谢谢回答。但我不想使用WMI。 - Rajesh Subramanian

2

首先,声明一个结构体如下:

[StructLayout(LayoutKind.Sequential)]
public struct OsVersionInfoEx
{
    public int dwOSVersionInfoSize;
    public uint dwMajorVersion;
    public uint dwMinorVersion;
    public uint dwBuildNumber;
    public uint dwPlatformId;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
    public string szCSDVersion;
    public UInt16 wServicePackMajor;
    public UInt16 wServicePackMinor;
    public UInt16 wSuiteMask;
    public byte wProductType;
    public byte wReserved;
}

您需要使用以下代码:

    using System.Runtime.InteropServices;

在你相关的类的顶部,声明如下:
    [DllImport("kernel32", EntryPoint = "GetVersionEx")]
    static extern bool GetVersionEx(ref OsVersionInfoEx osVersionInfoEx);

现在按照以下方式调用代码:
        const int VER_NT_WORKSTATION = 1;
        var osInfoEx = new OsVersionInfoEx();
        osInfoEx.dwOSVersionInfoSize = Marshal.SizeOf(osInfoEx);
        try
        {
            if (!GetVersionEx(ref osInfoEx))
            {
                throw(new Exception("Could not determine OS Version"));

            }
            if (osInfoEx.dwMajorVersion == 6 && osInfoEx.dwMinorVersion == 2 
                && osInfoEx.wProductType == VER_NT_WORKSTATION)
                MessageBox.Show("You've Got windows 8");

        }
        catch (Exception)
        {

            throw;
        }

4
与内置的 .Net API 相比,过于复杂。 :) - IAbstract
这实际上是检测Win8并区分标准/工作站和服务器版本的唯一方法。 - Learner

-1

不确定这是否正确,因为我只能检查我所拥有的 Windows 8 版本。

 int major = Environment.OSVersion.Version.Major;
 int minor = Environment.OSVersion.Version.Minor;

if ((major >= 6) && (minor >= 2))
{
    //do work here
}

8
主版本号为7,次版本号为0时会发生什么? - GvS
最好只获取版本并使用Substring(Environment.OSVersion.Version.ToString().Substring(0,3)),然后与版本表(http://msdn.microsoft.com/en-us/library/windows/desktop/ms724832(v=vs.85).aspx)进行比较。 - Random IT Guy
您可以根据需要更改运算符,但是根据我发布的内容,它将接受任何高于Windows 8 / Server 2012的操作系统。正如您从上面发布的MSDN链接中所看到的那样,目前只有6.2.x.x版本。 - Tsukasa
3
为什么不使用 Version.CompareToif( Environment.OSVersion.Version.CompareTo( new Version(6, 2) ) > 0 ) { /* win8 或更高版本 */ } - Dai
1
似乎需要Asik和@AngentFire解决方案的混合体。试图重新发明Version类已经实现的>=运算符是没有意义的。当你试图过度优化时,总是令人惊讶地发现像这样的事情变得如此简单却出错了。 - BTJ
这个答案非常错误。点赞数量确实令人惊讶。 - Andreas Rejbrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接