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

Posted

技术标签:

【中文标题】如何在 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)? 【发布时间】:2020-07-22 12:05:03 【问题描述】:

我阅读了很多 *** 帖子,但没有解决我的问题。 我想在 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;

但由于 Windows 10 1909 只是一个 bugfix 版本,没有自己的 SDK,因此也没有新的 UniversalApiContract 版本。因此,在 Windows 1909 安装中,检查 UniversalApiContract“9”会返回“false”,因此它会返回“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 是“未定义”的提示“没有权限”?但上面的代码有效。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢彼得!有用。我已经更新了我原来的帖子。

以上是关于如何在 UWP 应用(C# 或 WinJS)中获取 Windows 10 版本(例如 1809、1903、1909、...)?的主要内容,如果未能解决你的问题,请参考以下文章

WinJS UWP javascript - 如何通过文件输入读取文件

如何在 C# 中使用 HoloLens 2 在 2D UWP 应用程序中获取 Eye-gaze 位置

C# Uwp app webbrowser 控件无法获取设备位置

带有用于推送通知的 C# 后台任务的 WinJS 应用程序

默认情况下如何以全屏模式启动 uwp webview 应用程序

如何使用 C# 从 Windows 10 日历中检索 UWP 中的约会