1

为什么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;
}

我在物理上移除(并插入)我的外部显示器,但该功能从未运行。为什么?

4

3 回答 3

4

刚刚找到了其他问题的解决方案

在调用 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;
}
于 2014-06-01T05:07:32.387 回答
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;
}
于 2013-03-21T18:53:49.303 回答
0

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

于 2013-03-21T19:22:30.053 回答