Как я могу обнаружить Windows 8.1 в приложении для настольных компьютеров - программирование

Как я могу обнаружить Windows 8.1 в приложении для настольных компьютеров

В предварительном просмотре Windows 8.1 Environment.OSVersion.Version возвращает те же номера версий, что и Windows 8. Существует ли альтернативный способ обнаружения Windows 8.1.

4b9b3361

Ответ 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.