我是自由和开放源码软件游戏0 A.D. (https://play0ad.com)的开发人员,最近我意识到,我们对Windows 11版本的检测失败了,就像Windows8.1和Windows10之间的情况一样。
它报告了Windows10.0.22000,这在技术上是正确的版本,但我们希望它报告Windows 11。
下面是我们使用的当前代码
由于兼容性原因,我们只能使用Windows7SDK。
简单的解决办法是
if (osInfo.dwMajorVersion >= 10)
{
stream << "Win" << osInfo.dwMajorVersion;
}通过
if (osInfo.dwMajorVersion >= 10)
{
if (osInfo.dwMinorVersion > 22000)
stream << "Win" << 11;
else
stream << "Win" << osInfo.dwMajorVersion;
}是否有更可靠的/未来的证明解决方案。
提前感谢!
发布于 2021-11-04 10:41:40
我不确定这是否有效,但你能试一下这段代码吗?它使用sysinfoapi.h文件。但是,根据文档,它只在Windows上工作。
#include <iostream>
#include <sysinfoapi.h>
void print_os_info()
{
OSVERSIONINFOEX info;
ZeroMemory(&info, sizeof(OSVERSIONINFOEX));
info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
GetVersionEx((LPOSVERSIONINFO)&info);
printf("Windows version: %u.%u\n", info.dwMajorVersion, info.dwMinorVersion);
}
int main()
{
print_os_info();
}编辑:显然,未在Windows8.1或Windows10中显示的应用程序将根据sysinfoapi.h文档\返回Windows8OS版本值(6.2)
再次编辑:我尝试使用包含内容的$(Filename).exe.manifest文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity
type="win32"
name="Contoso.ExampleApplication.ExampleBinary"
version="1.2.3.4"
processorArchitecture="x86"
/>
<description>Contoso Example Application</description>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 and Windows 11 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
</application>
</compatibility>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<!--
UAC settings:
- app should run at same integrity level as calling process
- app does not need to manipulate windows belonging to
higher-integrity-level processes
-->
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>对我来说,这使得它打印出了Windows10.0而不是6.2
资料来源:舱单文件,sysinfoapi.h
发布于 2021-11-23 07:38:22
除了考虑Windows10构建大于22000的解决方案(至少对我来说是如此)之外,例如Windows11,我找到的唯一真正起作用的解决方案是WMI Win32_OperatingSystem class - Caption属性。
在我的dev Windows 10机器上,它给出了以下字符串:Microsoft Windows 10 Pro。
在我的另一台开发机器上,安装了Windows 11,相同的函数提供:Microsoft Windows 11 Pro。
不同之处在于字符串值-- "10“与"11”--但这至少比“构建大于”解决方案要好得多。
C#和C++工作得很好。
发布于 2022-01-20 09:38:40
我能够正确检索版本号。复制下面的代码。使用windows.h应该可以代替sysinfoapi.h。
#include<windows.h>
#include<stdio.h>
int main() {
OSVERSIONINFOEX info;
ZeroMemory(&info, sizeof(OSVERSIONINFOEX));
info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
GetVersionEx((LPOSVERSIONINFO)&info);
printf("Windows version: %u.%u\n", info.dwMajorVersion, info.dwMinorVersion);
}读取版本号的替代方法是使用GetProcAddress.“GetProcAddress”返回指定DLL函数的地址。
#include<iostream>
#include<string>
#include <windows.h>
using namespace std;
void main() {
int osver= 0.0;
NTSTATUS(WINAPI *RtlGetVersion)(LPOSVERSIONINFOEXW);
OSVERSIONINFOEXW osInfo;
*(FARPROC*)&RtlGetVersion = GetProcAddress(GetModuleHandleA("ntdll"), "RtlGetVersion");
if (NULL != RtlGetVersion) {
osInfo.dwOSVersionInfoSize = sizeof(osInfo);
RtlGetVersion(&osInfo);
osver = osInfo.dwMajorVersion;
}
}https://stackoverflow.com/questions/69836878
复制相似问题