为什么函数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;
}
我正在移除(并插入)我的外部显示器,但该功能永远不会运行。 为什么呢?
答案 0 :(得分:2)
在调用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:
方法,这相当于同样的事情。