以编程方式更改Mac显示屏亮度

17

如何从Cocoa应用程序更改Mac显示器亮度?


3
这是指在 Macintosh 自身上,还是在 iP* 上? - David Thornley
Mac本身(更具体地说,Mac Book Pro),我已经在这里找到线程告诉我在 iP* 上做这件事是不可能的。 - tig
1
我在此发布了一个 shell 实用程序,可以在以下网址中找到:https://github.com/pirate/mac-keyboard-brightness - Nick Sweeting
4个回答

15

CGDisplayIOServicePort已在OS 10.9中被弃用,所以您需要使用IOServiceGetMatchingServices来获取IODisplaySetFloatParameter的服务参数。这是一个基本函数,它查找名为“display”的服务并更改其亮度。

- (void) setBrightnessTo: (float) level
{

    io_iterator_t iterator;
    kern_return_t result = IOServiceGetMatchingServices(kIOMasterPortDefault,
                                                        IOServiceMatching("IODisplayConnect"),
                                                        &iterator);

    // If we were successful
    if (result == kIOReturnSuccess)
    {
        io_object_t service;
        while ((service = IOIteratorNext(iterator))) {
            IODisplaySetFloatParameter(service, kNilOptions, CFSTR(kIODisplayBrightnessKey), level);

            // Let the object go
            IOObjectRelease(service);

            return;
        }
    }
}

在Swift中(通过@Dov):

private func setBrightnessLevel(level: Float) {
    var iterator: io_iterator_t = 0

    let result = IOServiceGetMatchingServices(kIOMasterPortDefault,
                                              IOServiceMatching("IODisplayConnect").takeUnretainedValue(),
                                              &iterator)

    if result == kIOReturnSuccess {
        var service: io_object_t = 1

        for ;; {
            service = IOIteratorNext(iterator)

            if service == 0 {
                break
            }

            IODisplaySetFloatParameter(service, 0, kIODisplayBrightnessKey, level)
            IOObjectRelease(service)
        }
    }
}

(代码当然是开源的


1
编译器报错:"CFMutableDictionary类型的值没有'takeUnretainedValue'成员",在'let result...'的第二行。 - ixany

6

Expanding on Alex's answer:

In Xcode8 beta3 with Swift3, the code is a lot more streamlined.

 private func setBrightness(level: Float) {
    let service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IODisplayConnect"))

    IODisplaySetFloatParameter(service, 0, kIODisplayBrightnessKey, level)
    IOObjectRelease(service)
}


3

以下是 Alec Jacobson 的 Brightness 菜单源代码:

- (void) set_brightness:(float) new_brightness {
CGDirectDisplayID display[kMaxDisplays];
CGDisplayCount numDisplays;
CGDisplayErr err;
err = CGGetActiveDisplayList(kMaxDisplays, display, &numDisplays);

if (err != CGDisplayNoErr)
    printf("cannot get list of displays (error %d)\n",err);
for (CGDisplayCount i = 0; i < numDisplays; ++i) {
    CGDirectDisplayID dspy = display[i];
    CFDictionaryRef originalMode = CGDisplayCurrentMode(dspy);
    if (originalMode == NULL)
        continue;
            io_service_t service = CGDisplayIOServicePort(dspy);

    float brightness;
    err= IODisplayGetFloatParameter(service, kNilOptions, kDisplayBrightness,
                                    &brightness);
    if (err != kIOReturnSuccess) {
        fprintf(stderr,
                "failed to get brightness of display 0x%x (error %d)",
                (unsigned int)dspy, err);
        continue;
    }

    err = IODisplaySetFloatParameter(service, kNilOptions, kDisplayBrightness,
                                     new_brightness);
    if (err != kIOReturnSuccess) {
        fprintf(stderr,
                "Failed to set brightness of display 0x%x (error %d)",
                 (unsigned int)dspy, err);
        continue;
    }
}       

}

已经有一个链接指向页面,我可以在那里找到所有的源代码。 - tig

2
在Xcode 8 beta 6中无法编译:
IODisplaySetFloatParameter(service, 0, kIODisplayBrightnessKey, level)

无法将类型为“String”的值转换为预期的参数类型“CFString!”

所以让我们进行类型转换:

IODisplaySetFloatParameter(service, 0, kIODisplayBrightnessKey as CFString!, level)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接