2

我使用 TOSVersion.ToString 函数(使用 SysUtils)来检测 Windows 版本。然而,这是我在 Windows11 中得到的:

Windows 10 (Version 10.0, Build 21996, 64-bit Edition)

有没有可靠的方法来检测 Windows 11?我正在使用德尔福 10.3.3。

更新:Windows 11 正式发布,我再次尝试。这是我得到的:

Windows 10 (Version 10.0, Build 22000, 64-bit Edition)

4

4 回答 4

4

正如 Remy 指出的那样:使用WinAPI您有可能处于某种兼容模式,导致报告的版本低于实际的.

  1. 一种替代方法是检查预期文件的文件版本,即

    • %windir%\system32\ntoskrnl.exe或者
    • %windir%\explorer.exe

    使用GetFileVersionInfo()andVerQueryValue() -HiWord(dwFileVersionLS) 应该是22000或更高(根据Windows NT build/release number)。

  2. 另一种方法是在注册表中查看HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\文本CurrentBuildCurrentBuildNumber,检查两者中的最高值是否为22000或更高。

  3. David 已经在Checking Windows version on W10中写了一个详细的答案,其中有更多的替代方案,尽管专注于高/低版本号,而不是构建。但WMI可能会有所帮助

  4. (这仅适用于已确认的知识。)检查哪些API 导出可用:想法是特定的 Windows 版本/版本引入了特定的功能,因此如果导入失败,您知道您使用的是以下版本。一个过时的示例每个函数的最低版本的过时列表会给你一个想法。现在你“只需要”找出 Windows 11 引入了哪些新功能。

这些都不是万无一失的,但你可以将它们结合起来,然后得出结论。毕竟你仍然可以尝试你的方法来解析文本,而不是仅仅依赖数字。它还显示了您可以如何轻松地操纵系统根据使用的方法报告不同的版本。

于 2021-07-25T10:40:33.763 回答
3

Windows 11 的官方主版本号是 10。

Windows 11 公开预览版的官方内部版本号为 10.0.22000.168

早期版本:

  • 10.0.22000.71
  • 10.0.22000.65
  • 10.0.22000.51

微软视窗 11 常见问题

如果要检测预览版本,最早的内部版本号是 10.0.22000.51 Windows 11 版本历史

TOSVersion依赖于一些硬编码的名称和逻辑来返回操作系统名称。您将必须实现自己的检测、复制和修改TOSVersion记录或围绕它进行包装,您可以在其中使用旧版本的现有逻辑并实施基于 Windows 11 内部版本号的检查以检测 Windows 11。

有关检测操作系统版本的其他一般问题和方法,您可以参考AmigoJack 的回答

于 2021-10-29T11:00:09.163 回答
1

除了考虑 Windows 10 构建大于 22000 的解决方案(至少对我而言)非常弱,例如 Windows 11,我发现唯一真正有效的解决方案是WMIs Win32_OperatingSystem class - Caption属性。

在我的开发 Win10 机器上,它给出了以下字符串:Microsoft Windows 10 Pro.

在我的另一台开发机器上,安装了 Win11,同样的功能给出:Microsoft Windows 11 Pro.

区别在于字符串值——“10”与“11”——但这至少比“构建大于”解决方案要好得多。

C# 和 C++ 运行良好。

于 2021-11-23T07:32:35.130 回答
-2

最简单的方法是获取 Kernel32.dll 的版本,如果 Major Version 为 10 并且 Build Version >= 22000,那么您拥有的是 Windows 11。

在此处查看我的代码:如何在 Windows 11 中找到 Windows 产品名称?

于 2021-12-31T16:18:03.290 回答