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

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

看看这篇文章:

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

目前的build nmber将会是9431

另一种可能是使用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 } 

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

我不确定你是否会想要深入,但很容易通过简单的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有特别的要求。 事实上,如果您的应用程序没有在Windows 8.1操作系统中出现,我也使用了与System.Environment类实际上位于操作系统版本相同的技巧。

希望这可以帮助。 干杯!