C ++检查Windows 10

时间:2015-08-25 00:42:18

标签: c++ windows operating-system windows-10

我正在制作一个特定于操作系统的应用程序,但我似乎无法缩小Windows 10的范围,它出现在Windows 8上。我在Window 10 Pro上进行了测试,结果是主要:6分钟:2。还有另一种方法可以更有效地检查它是否是Windows 10?

编辑:找到一个正常工作的API RtlGetVersion()适用于所有操作系统!

id  | grouplabel
---------------
100 | Critical
100 | Mediocre
100 | Poor
100 | Superior
200 | Mediocre

4 个答案:

答案 0 :(得分:13)

这很讽刺,但是......

BOOL WINAPI IsWindows10OrGreater(void);

文档here

编辑:来自Redmond的天才似乎在思考原型方面存在问题,或者换句话说,OP会在评论中提到未定义的符号错误。还有这个功能:

BOOL WINAPI IsWindowsVersionOrGreater(
    WORD wMajorVersion,
    WORD wMinorVersion,
    WORD wServicePackMajor
);

而且,对于Windows 10,wMajorVersionwMinorVersionwServicePackMajor似乎分别是100和{{1} }。

该功能的文档here

第二次修改:它的官方:0IsWindowsVersionOrGreater()从8.1开始就被打破了。总是使用GetVersionEx(),其中IsWindowsXXXOrGreater()可以是XXXXPXPSP1XPSP2XPSP3,{{1 },VistaVistaSP1VistaSP277SP188Point1

答案 1 :(得分:4)

以下为我工作:

.
.
.
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
.
.
.

typedef void (WINAPI * RtlGetVersion_FUNC) (OSVERSIONINFOEXW *);
BOOL GetVersion(OSVERSIONINFOEX * os) {
    HMODULE hMod;
    RtlGetVersion_FUNC func;
#ifdef UNICODE
    OSVERSIONINFOEXW * osw = os;
#else
    OSVERSIONINFOEXW o;
    OSVERSIONINFOEXW * osw = &o;
#endif

    hMod = LoadLibrary(TEXT("ntdll.dll"));
    if (hMod) {
        func = (RtlGetVersion_FUNC)GetProcAddress(hMod, "RtlGetVersion");
        if (func == 0) {
            FreeLibrary(hMod);
            return FALSE;
        }
        ZeroMemory(osw, sizeof (*osw));
        osw->dwOSVersionInfoSize = sizeof (*osw);
        func(osw);
#ifndef UNICODE
        os->dwBuildNumber = osw->dwBuildNumber;
        os->dwMajorVersion = osw->dwMajorVersion;
        os->dwMinorVersion = osw->dwMinorVersion;
        os->dwPlatformId = osw->dwPlatformId;
        os->dwOSVersionInfoSize = sizeof (*os);
        DWORD sz = sizeof (os->szCSDVersion);
        WCHAR * src = osw->szCSDVersion;
        unsigned char * dtc = (unsigned char *)os->szCSDVersion;
        while (*src)
            * Dtc++ = (unsigned char)* src++;
        *Dtc = '\ 0';
#endif

    } else
        return FALSE;
    FreeLibrary(hMod);
    return TRUE;
}

.
.
.

//check win10
void mymethod() {

OSVERSIONINFOEX os;

    if (GetVersion(&os) == TRUE && os.dwMajorVersion == 10)
    {
        isWin10 = TRUE;
    }

}

参考。 :(http://yamatyuu.net/computer/program/vc2013/rtlgetversion/index.html

答案 2 :(得分:3)

更新:检查win7,win8.1和win10。现在一切都在确定。所以代码:

#include <windows.h>
#include <VersionHelpers.h>
#include <string>

std::string getWinVerion() {

OSVERSIONINFO info;
ZeroMemory(&info, sizeof(OSVERSIONINFO));
info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

GetVersionEx(&info);

std::string version = std::to_string(info.dwMajorVersion);
version.append(".").append(std::to_string(info.dwMinorVersion));

if (IsWindows7SP1OrGreater()) {
    if (version == "6.1")
        return "6.1";
}

if (IsWindows8Point1OrGreater())
    return "6.3";
else
    return "10.0";
}

答案 3 :(得分:2)

确实如此,检测这是否是Windows 10的唯一方法是使用

BOOL WINAPI IsWindows10OrGreater(void);

虽然您需要使用Visual Studio 2015获得最新的SDK。 请注意

BOOL WINAPI IsWindowsVersionOrGreater(
WORD wMajorVersion,
WORD wMinorVersion,
WORD wServicePackMajor);

不适用于Windows 10,同样适用于:

BOOL WINAPI GetVersionEx( _Inout_ LPOSVERSIONINFO lpVersionInfo);

有时会返回6.2或6.3。 (在Windows 10上完全删除。)