如何在桌面应用程序中检测Windows 8.1

时间:2013-07-01 07:24:40

标签: windows winapi

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

4 个答案:

答案 0 :(得分:24)

看一下这篇文章:

Operating system version changes in Windows 8.1 Preview

  

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

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

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

 <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

答案 1 :(得分: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
}

答案 2 :(得分:6)

使用ntdll!RtlGetVersion。这是GetVersionExVerifyVersionInfo使用的内容,它提供了正确的版本号。它需要一个OSVersionInfoExW结构的指针,就像GetVersionExW那样。如果成功,则返回STATUS_SUCCESS(0)。

答案 3 :(得分: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操作系统中出现。