首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确检测Windows 11

正确检测Windows 11
EN

Stack Overflow用户
提问于 2021-11-04 09:19:22
回答 3查看 1.2K关注 0票数 1

我是自由和开放源码软件游戏0 A.D. (https://play0ad.com)的开发人员,最近我意识到,我们对Windows 11版本的检测失败了,就像Windows8.1和Windows10之间的情况一样。

它报告了Windows10.0.22000,这在技术上是正确的版本,但我们希望它报告Windows 11。

下面是我们使用的当前代码

由于兼容性原因,我们只能使用Windows7SDK。

简单的解决办法是

代码语言:javascript
复制
    if (osInfo.dwMajorVersion >= 10)
    {
        stream << "Win" << osInfo.dwMajorVersion;
    }

通过

代码语言:javascript
复制
    if (osInfo.dwMajorVersion >= 10)
    {
        if (osInfo.dwMinorVersion > 22000)
            stream << "Win" << 11;
        else
            stream << "Win" << osInfo.dwMajorVersion;
    }

是否有更可靠的/未来的证明解决方案。

提前感谢!

EN

回答 3

Stack Overflow用户

发布于 2021-11-04 10:41:40

我不确定这是否有效,但你能试一下这段代码吗?它使用sysinfoapi.h文件。但是,根据文档,它只在Windows上工作。

代码语言:javascript
复制
#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文件

代码语言:javascript
复制
<?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

票数 2
EN

Stack Overflow用户

发布于 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++工作得很好。

票数 2
EN

Stack Overflow用户

发布于 2022-01-20 09:38:40

我能够正确检索版本号。复制下面的代码。使用windows.h应该可以代替sysinfoapi.h。

代码语言:javascript
复制
#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函数的地址。

代码语言:javascript
复制
#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;
      }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69836878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档