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

macOS开发中如何接收屏幕亮度变化的实时通知

macOS 屏幕亮度变化监听实现方案

macOS 存在等效于iOS UIScreen.brightnessDidChangeNotification 的原生事件监听能力,无需使用轮询方案,以下是两种可直接落地的实现方式:

方案1:系统分布式通知监听(推荐,实现成本最低)

系统会在屏幕亮度发生变更时主动发送全局分布式通知,直接注册监听即可在亮度变化时收到触发回调:

  • 通知类型:NSDistributedNotificationCenter 全局分布式通知
  • 通知名称:com.apple.Display.brightnessChanged

代码示例

Swift 实现

import AppKit

// 注册监听
DistributedNotificationCenter.default().addObserver(
    self,
    selector: #selector(handleBrightnessChange(_:)),
    name: NSNotification.Name(rawValue: "com.apple.Display.brightnessChanged"),
    object: nil
)

// 回调处理
@objc private func handleBrightnessChange(_ notification: Notification) {
    // 直接调用你已实现的亮度查询逻辑,获取最新亮度值处理即可
    let latestBrightness = getCurrentDisplayBrightness()
    // 后续业务逻辑
}

Objective-C 实现

#import <AppKit/AppKit.h>

// 注册监听
[[NSDistributedNotificationCenter defaultCenter] addObserver:self
    selector:@selector(handleBrightnessChange:)
    name:@"com.apple.Display.brightnessChanged"
    object:nil];

// 回调处理
- (void)handleBrightnessChange:(NSNotification *)notification {
    CGFloat latestBrightness = [self getCurrentDisplayBrightness];
    // 后续业务逻辑
}

注意事项

  • 该方案默认支持内置屏幕的亮度变化监听,多外接屏幕场景下,收到通知后遍历你已获取的IODisplayConnect实例分别查询亮度即可。
  • 沙盒应用无需额外权限即可正常监听该通知。

方案2:IOKit 底层参数变更监听(兼容性更强)

如果需要适配老旧系统、或者需要精准监听单块外接屏幕的亮度变更,可以通过IOKit框架注册IODisplayConnect服务的参数变更回调,直接监听kIODisplayBrightnessKey对应的参数变化,事件触发时可直接获取对应屏幕的最新亮度值,无需额外查询。
实现需要链接IOKit框架,步骤如下:

  • 遍历获取所有IODisplayConnect服务端口
  • 为每个服务端口注册参数变更回调,指定监听kIODisplayBrightnessKey参数
  • 回调触发时直接从返回的参数中读取最新亮度值即可

内容的提问来源于stack exchange,提问作者rid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 14:06:07