enumdisplaysettings 是 windows 获取当前显示器刷新率最直接可靠的方式,需传 enum_current_settings、清零 devmode 并设 dmsize,设备名可传 null;linux x11 用 xrandr --current 解析或 xrr api 计算;macos 用 cgdisplaymodegetrefreshrate。

Windows平台用 EnumDisplaySettings 获取当前显示器刷新率
在 Windows 上,EnumDisplaySettings 是最直接、最可靠的方式获取当前活动显示器的实时刷新频率(即 dmDisplayFrequency)。它不依赖显卡驱动私有接口,兼容性好,且能反映系统实际应用的设置(比如用户在“显示设置”里手动选了 144Hz)。
关键点是:必须传入 ENUM_CURRENT_SETTINGS(值为 -1),而不是枚举所有模式;否则返回的是显卡支持的候选列表,不是当前生效值。
- 调用前确保
DEVMODE结构体用ZeroMemory清零,并设置dmSize = sizeof(DEVMODE) - 设备名用
EnumDisplayDevices获取主显示器名(如\\.\DISPLAY1),或直接传NULL表示默认显示器(通常够用) -
dmDisplayFrequency单位是 Hz,但某些旧驱动可能返回 0 —— 这时应 fallback 到GetDeviceCaps(hdc, VREFRESH)(需创建临时 DC)
Linux X11 下通过 xrandr 命令解析或 XRR API 获取
Linux 没有统一内核接口,X11 环境下推荐两种方式:命令行解析更简单稳定,XRR API 更底层但需链接 -lXrandr。
用 xrandr --current 输出里找当前激活输出(标记为 * 的那一行),其后括号内的数字就是刷新率,例如 1920x1080 144.00*+ 中的 144.00。注意要过滤掉 + 和 *,并处理小数点精度问题。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 不要用
xrandr -q,它只显示可用模式,不一定包含当前生效值 - 若程序运行在 Wayland 会话中,
xrandr可能不可用或返回空 —— 此时需改用weston-info或 wlroots 相关 API(但无标准跨 compositor 方案) - 用 XRR API 时,先调
XRRGetScreenResources,再对每个输出调XRRGetOutputInfo找 active 输出,最后用XRRGetOutputPrimary+XRRGetCrtcInfo查当前 CRTC 的mode,再从XRRGetScreenResources的 modes 数组里匹配该 mode 的dot_clock / (h_total * v_total)计算实际刷新率
macOS 用 CGDisplayModeGetRefreshRate 获取主屏刷新率
macOS 提供了清晰的 Core Graphics 接口:CGMainDisplayID() 获取主屏 ID,再传给 CGDisplayModeGetRefreshRate。它返回浮点数(如 60.0 或 120.0),单位 Hz,且始终反映系统当前实际刷新频率(包括 ProMotion 动态切换后的瞬时值)。
- 注意:该函数仅对当前活跃的 display mode 生效;如果用户启用了 “自动切换刷新率”,返回值会随内容动态变化,需定期轮询(不建议高频调用,有开销)
- 不能用
CGDisplayGetBestModeForParameters查“支持的最大值”,那只是能力上限,不是当前值 - 多显示器场景下,每个屏幕需单独调用,
CGGetActiveDisplayList可枚举所有活跃屏 ID
跨平台封装要注意的三个坑
写通用代码时,最容易出错的不是获取逻辑本身,而是上下文缺失和时效性误判。
- Windows 上
EnumDisplaySettings返回的dmDisplayFrequency在多显示器异步刷新(如外接 144Hz 屏 + 笔记本 60Hz 屏)时,只反映调用时传入的显示器设备,不能跨屏复用 - Linux X11 下,
xrandr解析依赖 shell 环境变量($DISPLAY),GUI 程序若以 systemd service 启动可能拿不到正确值,需确保运行在用户 session 内 - macOS 的
CGDisplayModeGetRefreshRate在睡眠唤醒后可能短暂返回 0,建议加一次重试或 fallback 到上次缓存值
刷新率不是静态配置,它是显卡、驱动、窗口管理器、甚至当前渲染帧率共同协商的结果。真正需要“实时”值的场景(如游戏垂直同步适配),最好每帧都查一次,而不是初始化时缓存 —— 尤其在 macOS ProMotion 或 Windows 120Hz+ 自适应刷新下,这个值可能每秒变动多次。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










