2013-08-04 89 views
8

我正在使用OS X应用程序在所有连接的显示器的所有可用空间上显示自定义窗口。 我可以通过调用[NSScreen screens]来获得可用显示对象的数组。显示器连接或断开连接时的通知

我目前缺少的是一种告诉用户是否将显示器连接到系统或从系统断开屏幕的方式。

我已经搜索了Cocoa文档中处理类似情况的通知,但没有多少运气,并且我拒绝相信在更改连接到此处的显示器数量时没有某种系统通知被张贴系统。

有关如何解决此问题的任何建议?

+0

也许'NSApplicationDidChangeScreenParametersNotification'? –

回答

8

有几种方法来实现这一目标:
你可以在你的应用程序委托实现applicationDidChangeScreenParameters:(该方法是NSApplicationDelegateProtocol的一部分)。
另一种方法是侦听默认通知中心[NSNotificationCenter defaultCenter]发送的NSApplicationDidChangeScreenParametersNotification

无论何时您的委托方法被调用或您收到通知,您都可以遍历[NSScreen screens]并查看显示是否已连接或删除(您必须维护一个可在程序启动时检查的显示列表)。

非可可的方法是通过核心图形显示服务:
您必须实现重新配置功能,并与CGDisplayRegisterReconfigurationCallback(CGDisplayReconfigurationCallBack cb, void* obj);

注册它,在你重新配置功能,您可以查询受影响显示的状态。例如: -

void DisplayReconfigurationCallBack(CGDirectDisplayID display, CGDisplayChangeSummaryFlags flags, void* userInfo) 
{ 
    if(display == someDisplayYouAreInterestedIn) 
    { 
     if(flags & kCGDisplaySetModeFlag) 
     { 
      ... 
     } 
     if(flags & kCGDisplayRemoveFlag) 
     { 
      ... 
     } 
     if(flags & kCGDisplayDisabledFlag) 
     { 
      ... 
     } 
    } 
    if(flags & kCGDisplaySetModeFlag || flags & kCGDisplayDisabledFlag || flags & kCGDisplayRemoveFlag) 
    { 
     ... 
    } 
} 
+0

感谢您的评论。通过Cocoa通知和我的Cocoa方法使用Core Graphics Display服务有什么好处?在我看来,它增加了一层额外的复杂性,没有任何明显的收益。 – Gabor

+0

唯一的好处是重新配置回调已经包含了一些状态信息(作为CGDisplayChangeSummaryFlags提供),所以当重新配置发生时你不必亲自比较所有NSScreen细节。当然,Cocoa通知或委托方法也不错。 –

3

在SWIFT 3.0:

let nc = NotificationCenter.default 
    nc.addObserver(self, 
        selector: #selector(screenDidChange), 
        name: NSNotification.Name.NSApplicationDidChangeScreenParameters, 
        object: nil) 

NC回电话:

final func screenDidChange(notification: NSNotification){ 
    let userInfo = notification.userInfo 
    print(userInfo) 
} 
相关问题