如何通过编程方式检测Windows 11系统?
Windows 11系统检测方法
问题说明
需要检测应用是否运行在Windows 11上,但遇到以下问题:
- Version Helper APIs中没有针对Windows 11的专属接口
- 不清楚
IsWindowsXXOrGreater系列函数对应的版本参数 - 使用
RtlGetVersion时,返回的dwMajorVersion为10,无法区分Windows 10和Windows 11
可靠检测方案
Windows 11的主版本号(dwMajorVersion)仍为10,需通过**构建版本号(dwBuildNumber)**或官方新增的API来区分:
1. 使用官方Version Helper API(推荐)
从Windows 11 SDK起,官方新增了IsWindows11OrGreater()函数,直接调用即可完成检测:
#include <VersionHelpers.h> if (IsWindows11OrGreater()) { // 当前运行在Windows 11及更高版本 } else { // 运行在其他Windows系统 }
如果你的开发环境SDK版本较低,未包含该函数,可以手动通过构建版本号实现等价逻辑。
2. 基于RtlGetVersion检查构建版本
修改你原有的代码,通过dwBuildNumber判断:Windows 11的最低构建版本为22000。
NTSTATUS(WINAPI *RtlGetVersion)(LPOSVERSIONINFOEXW); OSVERSIONINFOEXW osInfo; *(FARPROC*)&RtlGetVersion = GetProcAddress(GetModuleHandleA("ntdll"), "RtlGetVersion"); if (NULL != RtlGetVersion) { osInfo.dwOSVersionInfoSize = sizeof(osInfo); RtlGetVersion(&osInfo); if (osInfo.dwMajorVersion == 10 && osInfo.dwBuildNumber >= 22000) { MessageBoxA(NULL, "运行在Windows 11系统", NULL, 0); } else if (osInfo.dwMajorVersion == 10) { MessageBoxA(NULL, "运行在Windows 10系统", NULL, 0); } else { MessageBoxA(NULL, "运行在其他Windows系统", NULL, 0); } }
3. 使用VerifyVersionInfoW函数(官方推荐的兼容方式)
该函数是微软推荐的版本检测方法,可避免版本欺骗等兼容性问题:
#include <windows.h> OSVERSIONINFOEXW osvi; DWORDLONG dwlConditionMask = 0; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEXW)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW); osvi.dwMajorVersion = 10; osvi.dwMinorVersion = 0; osvi.dwBuildNumber = 22000; // 设置检测条件:主版本=10,次版本=0,构建版本≥22000 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL); VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL); VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL); if (VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER, dwlConditionMask)) { // 运行在Windows 11及更高版本 }
内容的提问来源于stack exchange,提问作者Cesar
相关产品推荐
相关产品推荐

