【问题标题】:Adjust screen brightness in Mac OS X app在 Mac OS X 应用程序中调整屏幕亮度
【发布时间】:2015-12-17 22:15:33
【问题描述】:

我想在我的 Mac OS X 应用程序中控制主屏幕的亮度(如 F1/F2 按钮)。在 iOS 中,有这样的东西:

UIScreen.mainScreen().brightness = CGFloat(0.5)

在 OSX 中,我们有 NSScreen,它可以很好地找出主屏幕是什么,但它错过了 .brightness 方法。

那么如何在 OSX 上使用 Swift 调整显示器亮度?

【问题讨论】:

    标签: macos swift cocoa brightness


    【解决方案1】:

    在 OS X 上没有这么好的 API。

    我们必须使用IOServiceGetMatchingServices找到"IODisplayConnect"(显示设备)然后使用kIODisplayBrightnessKey设置亮度:

    func setBrightnessLevel(level: Float) {
    
        var iterator: io_iterator_t = 0
    
        if IOServiceGetMatchingServices(kIOMasterPortDefault, IOServiceMatching("IODisplayConnect"), &iterator) == kIOReturnSuccess {
    
            var service: io_object_t = 1
    
            while service != 0 {
    
                service = IOIteratorNext(iterator)
                IODisplaySetFloatParameter(service, 0, kIODisplayBrightnessKey, level)
                IOObjectRelease(service)
    
            }
    
        }
    }
    
    setBrightnessLevel(0.5)
    

    【讨论】:

    • 很好的解决方案,谢谢!在我的带有内置显示器的 MacBook 上工作得非常好。您能否也给我一个提示如何控制外部显示器的亮度,例如 CinemaDisplay?它是我必须匹配的另一个 IOService 吗?我在 Apple Docs 中找不到任何帮助。
    • 由于我们正在交互匹配“IODisplayConnect”的服务,我认为它适用于内部和外部显示器(实际上它应该适用于它找到的所有显示器)。如果它不适合你,那么我会进一步检查。 请注意,无论如何都无法从 OS X 以编程方式设置某些外部显示器。
    • 我用一台实际的 MacBookPro(带有最新的 OSX 10.11 Beta)和一台通过 DisplayPort/Thunderbold 连接的 Apple Thunderbold 显示器对其进行了测试。内置显示器有反应,但 Thunderbold-Display 没有。 NSScreen.screens() 正确返回两个显示。感谢您的支持:)
    • 您知道为什么它不能与多个显示器一起使用吗?
    • 不,我已经测试了很多东西,但没有找到为什么我们不能用这种方法获得外部显示器,也没有找到相关文档。我发现的所有其他方法现在都已弃用,根本不起作用。我现在只在 10.10+ 中看到这个不完整的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多