CGDisplayRegisterReconfigurationCallback:未调用回调

时间:2012-06-20 08:50:34

标签: objective-c screen

为什么函数displayChanged不会在以下代码中被触发?

#import <Cocoa/Cocoa.h>

static void displayChanged(CGDirectDisplayID displayID, CGDisplayChangeSummaryFlags flags, void *userInfo) {
    NSLog(@"%@, %@", displayID, flags); 
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        CGDisplayRegisterReconfigurationCallback(displayChanged, NULL);

        CFRunLoopRun();
    }
    return 0;
}

我正在移除(并插入)我的外部显示器,但该功能永远不会运行。 为什么呢?

3 个答案:

答案 0 :(得分:2)

刚刚在this other question

找到解决方案

在调用CFRunLoopRun之前,必须调用NSApplicationLoad与窗口服务器建立连接。这是原始问题的固定代码:

#import <Cocoa/Cocoa.h>

static void displayChanged(CGDirectDisplayID displayID, CGDisplayChangeSummaryFlags flags, void *userInfo) {
    NSLog(@"%u, %u", displayID, flags); 
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        CGDisplayRegisterReconfigurationCallback(displayChanged, NULL);

        NSApplicationLoad();  // establish a connection to the window server. In <Cocoa/Cocoa.h>
        CFRunLoopRun();       // run the event loop
    }
    return 0;
}

答案 1 :(得分:0)

我无法让CGDisplayRegisterReconfigurationCallback工作,所以我改为使用分布式通知:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        [[NSDistributedNotificationCenter defaultCenter] addObserverForName:@"com.apple.BezelServices.BMDisplayHWReconfiguredEvent" object:nil queue:nil usingBlock:^(NSNotification *notification) {
            NSLog(@"Displays changed!");
        }];

        CFRunLoopRun();
    }
    return 0;
}

答案 2 :(得分:0)

如果您正在使用AppKit(并且有一个正在运行的NSApplication事件循环),您可以收听NSApplicationDidChangeScreenParametersNotification通知。或者,您可以在应用程序委托中实现-applicationDidChangeScreenParameters:方法,这相当于同样的事情。