Как я могу обнаружить Windows 8.1 в настольном приложении
В предварительном просмотре Windows 8.1 Environment.OSVersion.Version возвращает те же номера версий, что и Windows 8. Существует ли альтернативный способ обнаружения Windows 8.1.
4 ответа
Посмотрите на эту статью:
Изменения версии операционной системы в 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 \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \Microsoft\Windows NT\CurrentVersion
Текущая версия даст вам 6,3
Текущая сборка будет 9431
Использование ntdll!RtlGetVersion
, Это то, что оба GetVersionEx
а также VerifyVersionInfo
использовать, и это дает правильный номер версии. Требуется указатель на OSVersionInfoExW
структура, как GetVersionExW
делает. Если это удается, он возвращает STATUS_SUCCESS
(0).
Другая возможность заключается в использовании 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
}
Я не уверен, что вы захотите углубиться в это, но легко получить точную версию операционной системы с помощью простого запроса 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.