在Windows 8.1预览版中,Environment.OSVersion.Version返回与Windows 8相同的版本号。是否有其他检测Windows 8.1的方法。
答案 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
。这是GetVersionEx
和VerifyVersionInfo
使用的内容,它提供了正确的版本号。它需要一个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操作系统中出现。