You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在预处理器中检查Windows内部版本?兼询DWMWA_BORDER_COLOR检测方法

检测Windows内部版本及DWM属性可用性的方法

一、预处理器层面检测(编译时判断)

由于WINVER/_WIN32_WINNT宏仅支持到Windows 10,要检测Windows 11及特定内部版本(如Build 22000),需使用Windows 11及以上版本SDK提供的新宏:

  1. 确保项目使用Windows 11 SDK或更高版本,旧SDK不包含相关版本宏。
  2. 包含头文件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 06:30:03