在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
。 这是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类实际上位于操作系统版本相同的技巧。
希望这可以帮助。 干杯!