应使用 RtlGetVersion 或读取注册表 CurrentBuildNumber 判断 Windows 版本,因 GetVersionEx 在 Win8.1+ 返回假版本;Win10 构建号为 10240–22621,Win11 起始为 22000,构建号 ≥22000 即为 Win11。

用 GetVersionEx 已经不行了,Windows 10+ 会返回假版本
从 Windows 8.1 开始,微软就禁用了 GetVersionEx 的真实版本号返回——哪怕你在 Win11 上调用,它默认只返回 dwMajorVersion=10,dwMinorVersion=0。这是为了兼容旧程序,但反而让版本检测变得更棘手。
所以别再查 OSVERSIONINFOEX 里的 dwMajorVersion 和 dwMinorVersion 来区分 Win10/Win11,它俩在 Win11 上也显示为 10.0。
- 必须改用
VerifyVersionInfo+VER_PRODUCT_TYPE或VER_BUILD_NUMBER组合判断 - 或者直接读注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentBuildNumber - 更推荐用
RtlGetVersion(需链接ntdll.lib),它绕过应用兼容性层,返回真实内核版本
用 RtlGetVersion 获取真实构建号判断 Win11
RtlGetVersion 是最轻量、最可靠的方式,它不走 UAC 兼容层,返回的是系统实际的 dwBuildNumber。Win10 的构建号范围是 10240–22621(22H2 最后版),Win11 起始于 22000(21H2),后续版本如 22621(22H2)、22631(23H2)等都 ≥22000。
示例代码片段(需包含 winternl.h,并显式声明函数):
NTSTATUS NTAPI RtlGetVersion(OSVERSIONINFOW* lpVersionInformation);
// ...
OSVERSIONINFOW osvi = {0};
osvi.dwOSVersionInfoSize = sizeof(osvi);
if (RtlGetVersion(&osvi) == 0) {
if (osvi.dwBuildNumber >= 22000) {
// Win11 or later
} else {
// Win10
}
}
- 注意:MSVC 默认不导出
RtlGetVersion,需用#pragma comment(lib, "ntdll.lib")或手动GetProcAddress -
dwBuildNumber是唯一稳定区分 Win10/Win11 的数字依据;dwMajorVersion和dwMinorVersion在两者上都是 10/0 - 该函数在 Windows XP SP3+ 均可用,无兼容性风险
注册表法备选:读 CurrentBuildNumber 字符串
如果不想链接 ntdll 或担心符号未解析,可以安全读取注册表键值。这个键是只读、公开、长期稳定的,且不需要管理员权限。
路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentBuildNumber,类型为 REG_SZ,值如 "22631"。
- 用
RegOpenKeyEx+RegQueryValueEx读取,转换为整数后与 22000 比较 - 比 WMI 或 PowerShell 调用快得多,适合启动时快速判断
- 注意:字符串末尾可能含空格或不可见字符,建议用
_tcstol或std::stoi安全转换 - 某些精简版或企业 LTSC 可能略过此键,但极罕见;建议 fallback 到
RtlGetVersion
别碰 IsWindows11 这种不存在的 API
截至 Windows SDK 10.0.26100(2024 年最新),Windows 官方 **没有提供** 名为 IsWindows11 的 API。网上很多博客写的“调用 IsWindows11”全是编译不过的伪代码,或是混淆了第三方封装库。
- SDK 中只有
IsWindows10OrGreater、IsWindowsServer等,但没有IsWindows11 - 试图
#include <versionhelpers.h></versionhelpers.h>并调用未声明函数,会导致链接失败或运行时崩溃 - 真正的判断逻辑必须自己写,核心就一条:构建号 ≥22000 → Win11
构建号才是 Windows 版本事实上的唯一标识,UI 层叫什么名字(“Windows 11”还是“Windows 10”)根本不重要——驱动、内核、API 行为全由构建号决定。别被开始菜单骗了。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











