Как я могу обнаружить 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.

Другие вопросы по тегам