显示连接或断开连接时的通知

时间:2013-08-04 11:56:13

标签: objective-c cocoa

我正在开发一个OS X应用程序,它在所有连接的显示器的所有可用空间上显示自定义窗口。 我可以通过调用[NSScreen屏幕]来获取可用显示对象的数组。

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

我在Cocoa文档中搜索了处理类似情况的通知而没有太多运气,我拒绝相信在更改连接到系统的显示器数量时没有发布某种系统通知

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

2 个答案:

答案 0 :(得分:10)

有几种方法可以实现这一点:
您可以在应用委托中实施applicationDidChangeScreenParameters:(该方法属于NSApplicationDelegateProtocol) 另一种方法是收听默认通知中心NSApplicationDidChangeScreenParametersNotification发送的[NSNotificationCenter defaultCenter]

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

非Cocoa方法将通过Core Graphics Display服务:
您必须实现重新配置功能并将其注册到CGDisplayRegisterReconfigurationCallback(CGDisplayReconfigurationCallBack cb, void* obj);

在重新配置功能中,您可以查询受影响的显示器的状态。 E.g:

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)
    {
        ...
    }
}

答案 1 :(得分: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)
}