如何在预处理器中检查Windows内部版本?兼询DWMWA_BORDER_COLOR检测方法
检测Windows内部版本及DWM属性可用性的方法
一、预处理器层面检测(编译时判断)
由于WINVER/_WIN32_WINNT宏仅支持到Windows 10,要检测Windows 11及特定内部版本(如Build 22000),需使用Windows 11及以上版本SDK提供的新宏:
- 确保项目使用Windows 11 SDK或更高版本,旧SDK不包含相关版本宏。
- 包含头文件
sdkddkver.h以获取版本定义,然后通过NTDDI_VERSION宏判断:
#include <sdkddkver.h> #if NTDDI_VERSION >= NTDDI_WIN11 // NTDDI_WIN11对应Windows 11 Build 22000 COLORREF hexCol = 0x00505050; DwmSetWindowAttribute(GetWin32Handle(), DWMWINDOWATTRIBUTE::DWMWA_BORDER_COLOR, &hexCol, sizeof(hexCol)); #endif
如果需要更精准的内部版本检测,可直接对比Build数值:
#include <sdkddkver.h> // _WIN32_WINNT_WIN11对应0x0A01,代表Windows 11主版本;WIN32_WINNT_BUILD为SDK内置的Build号宏 #if _WIN32_WINNT >= _WIN32_WINNT_WIN11 && WIN32_WINNT_BUILD >= 22000 // 执行仅在Build22000+支持的逻辑 #endif
二、运行时检测(兼容旧SDK编译的程序)
如果项目需要兼容旧SDK编译,或要在不同系统版本上自适应,可通过以下两种方式判断DWMWA_BORDER_COLOR是否可用:
方法1:检测系统版本
使用VerifyVersionInfoW(替代已弃用的GetVersionExW)判断当前系统是否为Windows 11 Build22000及以上:
#include <windows.h> BOOL IsWindows11Build22000OrLater() { OSVERSIONINFOEXW osvi = {0}; DWORDLONG conditionMask = 0; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW); osvi.dwMajorVersion = 10; osvi.dwMinorVersion = 0; osvi.dwBuildNumber = 22000; VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL); VER_SET_CONDITION(conditionMask, VER_MINORVERSION, VER_GREATER_EQUAL); VER_SET_CONDITION(conditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL); return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER, conditionMask); } // 使用示例 if(IsWindows11Build22000OrLater()) { COLORREF hexCol = 0x00505050; HRESULT hr = DwmSetWindowAttribute(GetWin32Handle(), DWMWINDOWATTRIBUTE::DWMWA_BORDER_COLOR, &hexCol, sizeof(hexCol)); if(FAILED(hr)) { // 处理调用失败(如系统未开启DWM等) } }
方法2:直接调用并检查返回值
无需提前检测系统版本,直接调用DwmSetWindowAttribute,通过返回值判断是否支持:
- 如果SDK未定义
DWMWA_BORDER_COLOR枚举,可直接使用其实际数值(34,来自官方文档定义) - 调用失败时,函数会返回
E_INVALIDARG或HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED),代表系统不支持该属性
COLORREF hexCol = 0x00505050; // 若旧SDK无枚举,替换为static_cast<DWMWINDOWATTRIBUTE>(34) HRESULT hr = DwmSetWindowAttribute(GetWin32Handle(), DWMWINDOWATTRIBUTE::DWMWA_BORDER_COLOR, &hexCol, sizeof(hexCol)); if(SUCCEEDED(hr)) { // 属性设置成功 } else { // 系统不支持,执行降级逻辑 }
内容的提问来源于stack exchange,提问作者Silverlan
相关产品推荐
相关产品推荐

