如何在 UWP 应用程序(C# 或 WinJS)中获取 Windows 10 版本(例如 1809、1903、1909 等)?

How to get Windows 10 version (e.g. 1809, 1903, 1909, ...) in a UWP app (C# or WinJS)?

我阅读了很多 Whosebug post,但没有解决我的问题的方法。 我想在 C# 或 WinJS 中获取 运行 Windows 10 安装的版本号(例如 1809 或 1909) 我用 Cordova (Javascript) 开发了一个 UWP 应用程序,我在 C# 中也有一个 Cordova 插件 (winmd),我可以使用它,但是没有 api 来获取这个 4 位版本号。

我有一个 WinJS/Javascript 代码,在版本 1903 之前都可以正常工作:

var ApiInformation = Windows.Foundation.Metadata.ApiInformation;
if (ApiInformation.isApiContractPresent("Windows.Foundation.UniversalApiContract", 9)) {
    return 9999;  // TODO: fix this build number, when it is released
} else if (ApiInformation.isApiContractPresent("Windows.Foundation.UniversalApiContract", 8)) {
    return 1903;
} else if (ApiInformation.isApiContractPresent("Windows.Foundation.UniversalApiContract", 7)) {
    return 1809;
} else if (ApiInformation.isApiContractPresent("Windows.Foundation.UniversalApiContract", 6)) {
    return 1803;
} else if (ApiInformation.isApiContractPresent("Windows.Foundation.UniversalApiContract", 5)) {
    return 1709
} else if (ApiInformation.isApiContractPresent("Windows.Foundation.UniversalApiContract", 4)) {
    return 1703;
} else if (ApiInformation.isApiContractPresent("Windows.Foundation.UniversalApiContract", 3)) {
    return 1607;
} else if (ApiInformation.isApiContractPresent("Windows.Foundation.UniversalApiContract", 2)) {
    return 1511;
} else if (ApiInformation.isApiContractPresent("Windows.Foundation.UniversalApiContract", 1)) {
    return 1507;
} else {
    return 0;
}

但是因为Windows10 1909只是一个bugfix版本,没有自己的SDK,所以也没有新的UniversalApiContract版本。因此,在 Windows 1909 安装中,检查 UniversalApiContract "9" returns "false" 等 returns "1903" 而不是 "1909"。

是否有一些开发人员在 1909 版中发现了 1909 版的新内容或独有内容,因此我们可以检查一下并说这是 1909 版?

重要提示:我正在开发一个 UWP 应用程序并且 Windows 有一个 UWP 应用程序的沙箱概念,所以有一些限制,例如UWP 应用无法访问 注册表 或整个文件系统。

[更新] 谢谢彼得!现在可以使用了。

我在 UWP Cordova WinJS/Javascript 中使用此代码:

var v = Windows.System.Profile.AnalyticsInfo.versionInfo.deviceFamilyVersion;
var major = (v & 0xFFFF000000000000) >> 48;
var minor = (v & 0x0000FFFF00000000) >> 32;
var build = (v & 0x00000000FFFF0000) >> 16;
var release = v & 0x000000000000FFFF;

if (build == 18363)
    return 1909;
if (build == 18362)
    return 1903;

我不得不使用 Windows.System.Profile.AnalyticsInfo.versionInfo.deviceFamilyVersion,因为 Windows.System.Profile.AnalyticsVersionInfo.deviceFamilyVersion 是 "undefined" 的提示"Permission denied"?但是上面的代码有效。

您可以使用AnalyticsInfo.VersionInfo.DeviceFamilyVersion获取版本号。

属性是一个包含一些数字的字符串。将字符串解析为 32 位数字,然后该 32 位数字的每个字节构成标准 A.B.C.D 版本的一部分。