1 #include "stdafx.h"
2 #include "WinVersionHelper.h"
3
WinVersion()4 WinVersion::WinVersion()
5 {
6 DWORD dwMajorVer{}, dwMinorVer{}, dwBuildNumber{};
7 HMODULE hModNtdll{};
8 if (hModNtdll = ::LoadLibraryW(L"ntdll.dll"))
9 {
10 typedef void (WINAPI *pfRTLGETNTVERSIONNUMBERS)(DWORD*, DWORD*, DWORD*);
11 pfRTLGETNTVERSIONNUMBERS pfRtlGetNtVersionNumbers;
12 pfRtlGetNtVersionNumbers = (pfRTLGETNTVERSIONNUMBERS)::GetProcAddress(hModNtdll, "RtlGetNtVersionNumbers");
13 if (pfRtlGetNtVersionNumbers)
14 {
15 pfRtlGetNtVersionNumbers(&dwMajorVer, &dwMinorVer, &dwBuildNumber);
16 dwBuildNumber &= 0x0ffff;
17 }
18 ::FreeLibrary(hModNtdll);
19 hModNtdll = NULL;
20 }
21 m_major_version = dwMajorVer;
22 m_minor_version = dwMinorVer;
23 m_build_number = dwBuildNumber;
24 }
25
26 ///////////////////////////////////////////////////////////////////////////////
27 WinVersion CWinVersionHelper::m_version;
28 bool CWinVersionHelper::m_windows10_light_theme{ false };
29
CWinVersionHelper()30 CWinVersionHelper::CWinVersionHelper()
31 {
32 }
33
~CWinVersionHelper()34 CWinVersionHelper::~CWinVersionHelper()
35 {
36 }
37
IsWindows11OrLater()38 bool CWinVersionHelper::IsWindows11OrLater()
39 {
40 if (m_version.m_major_version > 10)
41 return true;
42 else if (m_version.m_major_version == 10 && m_version.m_minor_version > 0)
43 return true;
44 else if (m_version.m_major_version == 10 && m_version.m_minor_version == 0 && m_version.m_build_number >= 21996)
45 return true;
46 else return false;
47
48 }
49
IsWindows10()50 bool CWinVersionHelper::IsWindows10()
51 {
52 return IsWindows10OrLater() && !IsWindows11OrLater();
53 }
54
IsWindows10FallCreatorOrLater()55 bool CWinVersionHelper::IsWindows10FallCreatorOrLater()
56 {
57 if (m_version.m_major_version > 10)
58 return true;
59 else if (m_version.m_major_version == 10 && m_version.m_minor_version > 0)
60 return true;
61 else if (m_version.m_major_version == 10 && m_version.m_minor_version == 0 && m_version.m_build_number >= 16299)
62 return true;
63 else return false;
64 }
65
IsWindowsVista()66 bool CWinVersionHelper::IsWindowsVista()
67 {
68 return (m_version.m_major_version == 6 && m_version.m_minor_version == 0);
69 }
70
IsWindows7()71 bool CWinVersionHelper::IsWindows7()
72 {
73 return (m_version.m_major_version == 6 && m_version.m_minor_version == 1);
74 }
75
IsWindows7OrLater()76 bool CWinVersionHelper::IsWindows7OrLater()
77 {
78 if (m_version.m_major_version > 6)
79 return true;
80 else if (m_version.m_major_version == 6 && m_version.m_minor_version >= 1)
81 return true;
82 else return false;
83 }
84
IsWindows8Or8point1()85 bool CWinVersionHelper::IsWindows8Or8point1()
86 {
87 return (m_version.m_major_version == 6 && m_version.m_minor_version > 1);
88 }
89
IsWindows8OrLater()90 bool CWinVersionHelper::IsWindows8OrLater()
91 {
92 if (m_version.m_major_version > 6)
93 return true;
94 else if (m_version.m_major_version == 6 && m_version.m_minor_version > 1)
95 return true;
96 else return false;
97 }
98
IsWindows81OrLater()99 bool CWinVersionHelper::IsWindows81OrLater() {
100 if (m_version.m_major_version > 6) return true;
101 else if (m_version.m_major_version == 6 && m_version.m_minor_version > 2) return true;
102 return false;
103 }
104
IsWindows10OrLater()105 bool CWinVersionHelper::IsWindows10OrLater()
106 {
107 return (m_version.m_major_version >= 10);
108 }
109
IsWindows10Version1809OrLater()110 bool CWinVersionHelper::IsWindows10Version1809OrLater()
111 {
112 if (m_version.m_major_version > 10)
113 return true;
114 else if (m_version.m_major_version == 10 && m_version.m_minor_version > 0)
115 return true;
116 else if (m_version.m_major_version == 10 && m_version.m_minor_version == 0 && m_version.m_build_number >= 17763)
117 return true;
118 else return false;
119 }
120
IsWindows10LightTheme()121 bool CWinVersionHelper::IsWindows10LightTheme()
122 {
123 return m_windows10_light_theme;
124 }
125
126
CheckWindows10LightTheme()127 void CWinVersionHelper::CheckWindows10LightTheme()
128 {
129 m_windows10_light_theme = false;
130 if (m_version.m_major_version >= 10)
131 {
132 HKEY hKey;
133 DWORD dwThemeData(0);
134 LONG lRes = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", 0, KEY_READ, &hKey);
135 if (lRes == ERROR_SUCCESS) {
136 GetDWORDRegKeyData(hKey, L"SystemUsesLightTheme", dwThemeData);
137 m_windows10_light_theme = (dwThemeData != 0);
138 }
139 RegCloseKey(hKey);
140 }
141 }
142
GetDWORDRegKeyData(HKEY hKey,const wstring & strValueName,DWORD & dwValueData)143 LONG CWinVersionHelper::GetDWORDRegKeyData(HKEY hKey, const wstring& strValueName, DWORD& dwValueData)
144 {
145 DWORD dwBufferSize(sizeof(DWORD));
146 DWORD dwResult(0);
147 LONG lError = ::RegQueryValueExW(hKey, strValueName.c_str(), NULL, NULL, reinterpret_cast<LPBYTE>(&dwResult), &dwBufferSize);
148 if (lError == ERROR_SUCCESS)
149 dwValueData = dwResult;
150 return lError;
151 }
152