我正在使用Windows 10 10240通用的Windows应用程序,当我使用Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamilyVersion来获取设备版本时,它返回了一个字符串“2814750438211605”,而不是版本格式(major.minor.revision.build)。
有人能告诉我这个字符串“2814750438211605”是什么意思吗?
我正在使用Windows 10 10240通用的Windows应用程序,当我使用Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamilyVersion来获取设备版本时,它返回了一个字符串“2814750438211605”,而不是版本格式(major.minor.revision.build)。
有人能告诉我这个字符串“2814750438211605”是什么意思吗?
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 实现此功能的方法,那么你可能会发现这篇文章很有用。
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);
}
你的应用程序应该将此视为不透明数据,并只记录它"原样"。这是一个64位十进制值作为字符串。
请记住,此API的目的是提供一个日志字符串,您可以从中重新构建操作系统版本号以进行支持/分析。在服务器端分析上,如果需要,您可以转换它或仅使用它作为唯一的版本标识符......如果您实际上正在尝试运行时解析它,则您正在错误使用它,并很可能会重新创建导致GetVersionEx
和VerifyVersionInfo
首先过时的相同问题。
请勿在您的应用程序中运行时解析该字符串。只需存储"原样" 请记住,对于Windows 10,客户真的不知道您问"您的Windows版本是多少?"意味着什么。答案是"10",长期以来可能仍然是"10"。
这只是一种巧妙的方法..我创建了一个枚举,用于匹配预定义的设备系列
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) { }
}
Windows.System.Profile.AnalyticsInfo.AnalyticsVersionInfo.DeviceFamilyVersion
会得到相同的结果吗? - Herdo