Windows 10获取DeviceFamilyVersion

6

我正在使用Windows 10 10240通用的Windows应用程序,当我使用Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamilyVersion来获取设备版本时,它返回了一个字符串“2814750438211605”,而不是版本格式(major.minor.revision.build)。

有人能告诉我这个字符串“2814750438211605”是什么意思吗?


如果您使用 Windows.System.Profile.AnalyticsInfo.AnalyticsVersionInfo.DeviceFamilyVersion 会得到相同的结果吗? - Herdo
4
在其中,将其转换为十六进制。2814750438211605等于0x000A000028004015,即10.0.10240.16405,是Win10的版本号。 - Hans Passant
@HansPassant 非常好,非常感谢! - tao
@HansPassant 可以作为答案吗? :) - Herdo
我放弃了。这个需要微软来记录,而不是我。 - Hans Passant
4个回答

20

Windows 10操作系统版本值存储在此字符串属性中:
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

谢谢,它能工作但不知道为什么在JavaScript上不能工作... 希望有人能回答我...它在第一位数字上给了我0。 var version = 2814750438211613, v1 = (version & 0xFFFF000000000000) >>48, v2 = (version & 0x0000FFFF00000000) >> 32, v3 = (version & 0x00000000FFFF0000) >> 16, v4 = version & 0x000000000000FFFF;第一个会出错,而且会返回0而不是10。 - Thomas Lee

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);
}

3

你的应用程序应该将此视为不透明数据,并只记录它"原样"。这是一个64位十进制值作为字符串。

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

请勿在您的应用程序中运行时解析该字符串。只需存储"原样" 请记住,对于Windows 10,客户真的不知道您问"您的Windows版本是多少?"意味着什么。答案是"10",长期以来可能仍然是"10"。


这对于解决现场问题并没有什么帮助。如果你想要在分析中记录完整的 DFV 以便调试任何问题,你必须按照 Martin 上面提到的方法去做。 - bc3tech
你真正需要的是崩溃转储文件,对吗?你可以通过门户获取它们。 - Chuck Walbourn
不一定需要。任何记录,真的。"提交报告"对话框和电子邮件...等等。 - bc3tech

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) { }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接