我正在开发一个 OS X 应用程序,该应用程序在所有连接的显示器的所有可用空间上显示自定义窗口。我可以通过调用 [NSScreen 屏幕] 来获取可用显示对象的数组。
我目前缺少的是一种判断用户是否将显示器连接到系统或从系统断开屏幕的方法。
我已经在 Cocoa 文档中搜索了处理此类场景的通知,但运气不佳,并且我拒绝相信在更改连接到系统的显示器数量时不会发布某种系统通知。
关于如何解决这个问题的任何建议?
我正在开发一个 OS X 应用程序,该应用程序在所有连接的显示器的所有可用空间上显示自定义窗口。我可以通过调用 [NSScreen 屏幕] 来获取可用显示对象的数组。
我目前缺少的是一种判断用户是否将显示器连接到系统或从系统断开屏幕的方法。
我已经在 Cocoa 文档中搜索了处理此类场景的通知,但运气不佳,并且我拒绝相信在更改连接到系统的显示器数量时不会发布某种系统通知。
关于如何解决这个问题的任何建议?
有几种方法可以实现:
您可以在您的应用程序委托中实现applicationDidChangeScreenParameters:(该方法是 的一部分NSApplicationDelegateProtocol
)。
另一种方法是监听NSApplicationDidChangeScreenParametersNotification
默认通知中心发送的消息[NSNotificationCenter defaultCenter]
。
每当您的委托方法被调用或您收到通知时,您都可以遍历[NSScreen screens]
并查看显示器是否已连接或删除(您必须维护一个可以在程序启动时检查的显示列表)。
非 Cocoa 方法是通过 Core Graphics Display 服务:
您必须实现重新配置功能并将其注册到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)
{
...
}
}
在 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)
}