2015-09-21 113 views
4

我想要控制Mac OS X應用程序(如F1/F2按鈕)中主屏幕的亮度。在iOS中,有這樣的事情:在Mac OS X應用程序中調整屏幕亮度

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

在OSX我們NSScreen,這是很好的找出主畫面是什麼,但它忽略了.brightness方法。

那麼如何在OSX上使用Swift調整顯示器亮度?

回答

9

有在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) 
+0

偉大的解決方案, 謝謝!使用內置顯示屏在我的MacBook上工作得很好。你能不能請給我一個提示如何控制外部顯示器的亮度,比如CinemaDisplay?這是我必須匹配的另一個IOService嗎?我在Apple Docs中找不到任何幫助。 – ixany

+0

因爲我們正在交付匹配「IODisplayConnect」的服務,我認爲它可以用於內部和外部顯示器(它應該適用於實際發現的所有顯示器)。如果它不適合你,我會進一步檢查。 *請注意,某些外部顯示器無法通過OS X以編程方式安裝。* – Moritz

+0

我使用實際的MacBookPro(帶有最新的OSX 10.11 Beta)和通過DisplayPort/Thunderbold連接的Apple Thunderbold Display進行了測試。內置顯示屏反應,但Thunderbold-Display沒有。 'NSScreen.screens()'正確返回兩個顯示。感謝您的支持:) – ixany