В предварительном просмотре Windows 8.1 Environment.OSVersion.Version возвращает те же номера версий, что и Windows 8. Существует ли альтернативный способ обнаружения Windows 8.1.
Как я могу обнаружить Windows 8.1 в приложении для настольных компьютеров
Ответ 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
Текущая сборка nmber будет равна 9431
Ответ 2
Другая возможность заключается в использовании функции 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
}
Ответ 3
Используйте ntdll!RtlGetVersion
. Это то, что используются как GetVersionEx
, так и VerifyVersionInfo
, и дает правильный номер версии. Он принимает указатель на структуру OSVersionInfoExW
, например GetVersionExW
. Если он преуспевает, он возвращает STATUS_SUCCESS
(0).
Ответ 4
Я не уверен, что вы захотите пойти так глубоко, но легко получить точную версию операционной системы с помощью простого запроса WMI-запроса, как описано ниже. Я упомянул метод, который вы можете подключить непосредственно к своему коду, чтобы получить точную версию операционной системы. Обязательные пространства имен, которые должны быть импортированы для этого фрагмента кода С#, были упомянуты чуть выше функции:
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.