如何使用 Delphi 10.3.3 检测 Windows 11

Posted

技术标签:

【中文标题】如何使用 Delphi 10.3.3 检测 Windows 11【英文标题】:How to detect Windows 11 using Delphi 10.3.3 【发布时间】:2021-10-01 06:15:01 【问题描述】:

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

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

是否有任何可靠的方法来检测 Windows 11?我正在使用 Delphi 10.3.3。

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

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

【问题讨论】:

我想如果内部版本号大于20000 “我使用 TOSVersion.ToString 函数(使用 SysUtils)来检测 Windows 版本。”这对我来说听起来很糟糕。 是否有特殊原因需要检测 Windows 版本?通常最好在运行时检测您需要的功能的存在,而不是依赖特定的版本号。尤其是近年来,微软确实在不遗余力地隐藏版本号,并弃用能够检索它们的 API。 @Andrzej 但是为什么?除了显示它,你用这些信息控制什么样的逻辑?在任何情况下,获取操作系统版本号的最佳方法之一是在Ntdll.dl 中使用RtlGetVersion(),即不受(尚未?)受清单虚拟化影响。 Windows 11 尚未公开发布,仅在预览版中。它甚至还没有为应用清单定义正确的 supportedOS guid。 内部版本号截止不是 20000 而是 22000。或者如果您想捕获泄露的 beta 21996,但这样做可能会由于它不完整而导致兼容性问题。 【参考方案1】:

正如 Remy 指出的那样:使用 WinAPI 您可能会遇到compatibility mode, resulting in getting a version reported that is lower than the actual。

    另一种方法是检查预期文件的文件版本,即

    %windir%\system32\ntoskrnl.exe%windir%\explorer.exe

    using GetFileVersionInfo() and VerQueryValue() - HiWord(dwFileVersionLS) 应该是22000 或更高(根据Windows NT build/release number)。

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

    David 已经在Checking Windows version on W10 中写了一个详细的答案,提供了更多替代方案,尽管重点关注的是高/低版本号,而不是构建。但是WMI might help。

    (这只能在确认知识的情况下进行追溯。) 检查哪些 API 导出 可用:这个想法是特定的功能是在特定的 Windows 版本/版本中引入的,因此,如果导入失败,您知道您使用的是以下版本。 outdated example 和 outdated list of minimum versions per function 会给你一个想法。现在您“只需”了解 Windows 11 引入了哪些新功能。

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

【讨论】:

【参考方案2】:

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

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

早期版本:

10.0.22000.71 10.0.22000.65 10.0.22000.51

Microsoft Windows 11 FAQ

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

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

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

【讨论】:

这是有道理的。非常感谢您的回复。【参考方案3】:

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

在我的开发 Win10 机器上,它提供以下字符串:Microsoft Windows 10 Pro

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

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

C# 和 C++ 运行良好。

【讨论】:

这个答案是duplicate answer 到this question。不一定是坏事,但应该注意,尤其是当 Windows 11 开始出现在行业中时。【参考方案4】:

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

在这里查看我的代码:How can I find the Windows product name in Windows 11?

【讨论】:

请不要对多个问题添加相同的答案。回答最好的一个并将其余的标记为重复。请参阅Is it acceptable to add a duplicate answer to several questions? - 虽然这不是相当重复的答案,但它基本上只是链接。

以上是关于如何使用 Delphi 10.3.3 检测 Windows 11的主要内容,如果未能解决你的问题,请参考以下文章

delphi 如何屏蔽win98和winme下的系统热键alt+f4,ctrl+

如何使用Delphi在Win7防火墙中打开端口

教程-在Delphi中怎么查看是否有内存泄漏(Delphi2007)+WIN7

delphi 如何检测代理服务器是不是正常

delphi 如何实现进程隐藏或防杀?(完整且上机切实有效!!)

Delphi - 如何检测防病毒软件的存在?