13

在 Windows 8.1 预览版 Environment.OSVersion.Version 返回与 Windows 8 相同的版本号。是否有检测 Windows 8.1 的替代方法。

4

4 回答 4

24

看看这篇文章:

Windows 8.1 Preview 中的操作系统版本更改

GetVersion(Ex)API 已被弃用。这意味着虽然您仍然可以调用 API,但如果您的应用程序没有专门针对 Windows 8.1 Preview,您将获得 Windows 8 版本控制 (6.2.0.0)。

GetVersion除非您在清单中明确指示 8.1,否则它所说的是对您的真实操作系统版本的谎言。

您需要将以下内容添加到应用清单中:

 <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <application> 
      * <!-- Windows 8.1 -->
      * <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
        <!-- Windows Vista -->
        <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
        <!-- Windows 7 -->
        <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
        <!-- Windows 8 -->
        <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
    </application> 
</compatibility>

如果您不想这样做,可以检查以下注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

当前版本将为您提供 6.3

当前版本号为 9431

于 2013-07-01T14:32:04.480 回答
6

另一种可能性是使用该VerifyVersionInfo函数,即使您的应用程序没有 user844541 提到的相应清单文件,它也会返回正确的结果。

例子:

BOOL CompareWindowsVersion(DWORD dwMajorVersion, DWORD dwMinorVersion)
{
    OSVERSIONINFOEX ver;
    DWORDLONG dwlConditionMask = 0;

    ZeroMemory(&ver, sizeof(OSVERSIONINFOEX));
    ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    ver.dwMajorVersion = dwMajorVersion;
    ver.dwMinorVersion = dwMinorVersion;

    VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
    VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL);

    return VerifyVersionInfo(&ver, VER_MAJORVERSION | VER_MINORVERSION, dwlConditionMask);
}

用法:

if(CompareWindowsVersion(6, 3))
{
    // Windows 8.1
}
于 2013-10-01T14:58:54.133 回答
6

使用ntdll!RtlGetVersion. 这是两者都GetVersionEx使用VerifyVersionInfo的,它给出了正确的版本号。它需要一个指向OSVersionInfoExW结构的指针,就像这样GetVersionExW做一样。如果成功,则返回STATUS_SUCCESS(0)。

于 2013-11-16T15:31:01.127 回答
2

我不确定您是否想要深入了解,但通过如下所述的简单 WMI 查询调用很容易获得准确的操作系统版本。我已经提到了一种方法,您可以直接将其插入代码以获取确切的操作系统版本。为此 C# 代码片段导入所需的命名空间已在函数上方提到:

using System;
using System.Management;
private string GetOsVersion()
{
        var sccmManagementScope = new ManagementScope(@"\\" + System.Environment.MachineName + @"\root\cimv2");
        var searchResult = new ManagementObjectSearcher(sccmManagementScope, new WqlObjectQuery("SELECT Version FROM Win32_OperatingSystem"));
        var resultSet = searchResult.Get();
        var osVersion = string.Empty;
        foreach (ManagementObject managementObject in resultSet)
        {
            osVersion = Convert.ToString(managementObject["Version"]);
        }
        return osVersion;
    }

尽管我仍然坚信它System.Environment.OSVersion.Version应该能够满足您的大部分需求,除非您对目标 Windows 8.1 有一些非常具体的要求。事实上,System.Environment如果您的应用程序未针对 Windows 8.1 操作系统显示,我对其中一项要求使用了相同的技巧,因为类实际上取决于操作系统版本。

于 2014-08-20T05:54:22.790 回答