我正在制作一个特定于操作系统的应用程序,但我似乎无法缩小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
答案 0 :(得分:13)
这很讽刺,但是......
BOOL WINAPI IsWindows10OrGreater(void);
文档here。
编辑:来自Redmond的天才似乎在思考原型方面存在问题,或者换句话说,OP会在评论中提到未定义的符号错误。还有这个功能:
BOOL WINAPI IsWindowsVersionOrGreater(
WORD wMajorVersion,
WORD wMinorVersion,
WORD wServicePackMajor
);
而且,对于Windows 10,wMajorVersion
,wMinorVersion
和wServicePackMajor
似乎分别是10
,0
和{{1} }。
该功能的文档here。
第二次修改:它的官方:0
和IsWindowsVersionOrGreater()
从8.1开始就被打破了。总是使用GetVersionEx()
,其中IsWindowsXXXOrGreater()
可以是XXX
,XP
,XPSP1
,XPSP2
,XPSP3
,{{1 },Vista
,VistaSP1
,VistaSP2
,7
,7SP1
,8
或8Point1
。
答案 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上完全删除。)