Windows 10获得DeviceFamilyVersion

问题描述 投票:6回答:4

我正在使用Windows 10 10240 Univasal windows应用程序,当我使用Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamilyVersion获取deivce版本时,它返回一个字符串“2814750438211605”而不是版本格式(major.minor.revision.build) )。谁能告诉我字符串“2814750438211605”是什么意思?

win-universal-app windows-10
4个回答
16
投票

Windows 10 OS版本值位于此字符串属性中: Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamilyVersion

它返回字符串值,如“2814750438211613”。 要将此长数字转换为可读格式,请使用以下命令:

string sv = AnalyticsInfo.VersionInfo.DeviceFamilyVersion;
ulong v = ulong.Parse(sv);
ulong v1 = (v & 0xFFFF000000000000L) >> 48;
ulong v2 = (v & 0x0000FFFF00000000L) >> 32;
ulong v3 = (v & 0x00000000FFFF0000L) >> 16;
ulong v4 = v & 0x000000000000FFFFL;
string version = $"{v1}.{v2}.{v3}.{v4}"; // == 10.0.10240.16413

3
投票

您的应用程序应将不透明数据视为不透明数据,并按“原样”进行记录。它是一个64位十进制值作为字符串。

请记住,此API的目的是提供一个日志字符串,您可以从中重新构建支持/分析的操作系统版本号。在您的服务器端分析中,您可以根据需要进行转换,或者仅将其用作唯一版本标识符...如果您实际上正在尝试解析它的运行时,那么您使用它的方式不正确并且很可能重新创建相同的问题导致GetVersionExVerifyVersionInfo首先被弃用。

不要在应用程序的运行时解析字符串。只是按“原样”存储请记住,对于Windows 10,如果您询问“您拥有什么版本的Windows?”,客户真的不知道您的意思。答案是“10”,并且在很长一段时间内可能仍然是“10”。


3
投票

如果您发现了这个问题并且像我一样,您正在寻找一种在JavaScript中执行此操作的方法,那么您可能会觉得这很有用。

getDeviceFamilyVersion() {
    let deviceFamilyVersion = Windows.System.Profile.AnalyticsInfo.versionInfo.deviceFamilyVersion;
    let deviceFamilyVersionDecimalFormat = parseInt(deviceFamilyVersion);

    if (isNaN(deviceFamilyVersionDecimalFormat)) {
        throw new Error('cannot parse device family version number');
    }

    let hexString = deviceFamilyVersionDecimalFormat.toString(16).toUpperCase();

    while (hexString.length !== 16) { // this is needed because JavaScript trims the leading zeros when converting to hex string
        hexString = '0' + hexString;
    }

    let hexStringIterator = 0;
    let versionString = '';
    while (hexStringIterator < hexString.length) {
        let subHexString = hexString.substring(hexStringIterator, hexStringIterator + 4);
        let decimalValue = parseInt(subHexString, 16);

        versionString += decimalValue + '.';
        hexStringIterator += 4;
    }

    return versionString.substring(0, versionString.length - 1);
}

0
投票

这只是一种很好的方式。我创建一个用于匹配预定义设备系列的枚举

public enum DeviceFamily
{
    Unknown,
    Desktop,
    Tablet,
    Mobile,
    SurfaceHub,
    Xbox,
    Iot
}

此方法将检查并将其解析为枚举。

   var q = ResourceContext.GetForCurrentView().QualifierValues;
    if (q.ContainsKey("DeviceFamily"))
    {
        try
        {
            Enum.Parse(typeof(DeviceFamily) , q["DeviceFamily"]);
            //send the user notification about the device family he is in.
        }
        catch (Exception ex) { }
    }
© www.soinside.com 2019 - 2024. All rights reserved.