请看这篇文章:
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
另一个可能性是使用VerifyVersionInfo
函数,即使你的应用程序没有用户844541提到的相应清单文件,它仍然可以返回正确的结果。
例如:
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
。这是GetVersionEx
和VerifyVersionInfo
都使用的方法,它可以给出正确的版本号。它需要一个指向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
类会错误报告操作系统版本。
Environment.OSVersion
,这是 .NET 的特性。你需要哪种解决方案? - Damien_The_Unbeliever