我正在使用Windows 10 10240 Univasal windows应用程序,当我使用Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamilyVersion获取deivce版本时,它返回一个字符串“2814750438211605”而不是版本格式(major.minor。 revision.build)。 任何人都可以告诉我字符串“2814750438211605”是什么意思?
答案 0 :(得分: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
答案 1 :(得分:3)
您的应用程序应将不透明数据视为“不透明”,并按“原样”进行记录。它是一个64位十进制值作为字符串。
请记住,此API的目的是提供一个日志字符串,您可以从中重新构建支持/分析的操作系统版本号。在您的服务器端分析中,您可以根据需要进行转换,或者仅将其用作唯一版本标识符...如果您实际上正在尝试解析它的运行时,那么您使用它的方式不正确并且很可能重新创建相同的问题导致GetVersionEx
和VerifyVersionInfo
被弃用。
不要在应用程序的运行时解析字符串。只需按“原样”存储请记住,对于Windows 10,如果您询问“您有什么版本的Windows?”,客户真的不知道您的意思。答案是“10”,在很长一段时间内可能仍然是“10”。
答案 2 :(得分: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 :(得分: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) { }
}