我正在开发一款OS X应用程序,该程序在所有连接的显示器的所有可用空间上显示自定义窗口。 通过调用[NSScreen screens]可以获取可用显示对象数组。
目前我需要解决的问题是如何知道用户是否连接或断开了系统中的屏幕。
我已经搜索了Cocoa文档以寻找处理此类场景的通知,但并没有太大的运气,我不相信没有某种系统通知可以在更改连接到系统的显示器数量时发布。
请问如何解决这个问题?
我正在开发一款OS X应用程序,该程序在所有连接的显示器的所有可用空间上显示自定义窗口。 通过调用[NSScreen screens]可以获取可用显示对象数组。
目前我需要解决的问题是如何知道用户是否连接或断开了系统中的屏幕。
我已经搜索了Cocoa文档以寻找处理此类场景的通知,但并没有太大的运气,我不相信没有某种系统通知可以在更改连接到系统的显示器数量时发布。
请问如何解决这个问题?
有几种方法可以实现这个目标:
您可以在应用程序委托中实现applicationDidChangeScreenParameters: 方法(该方法属于NSApplicationDelegateProtocol
)。
另一种方法是通过监听由默认通知中心 [NSNotificationCenter defaultCenter]
发送的NSApplicationDidChangeScreenParametersNotification
通知来实现。
每当调用您的委托方法或接收到通知时,您都可以迭代[NSScreen screens]
并查看是否连接或移除了显示器(您必须维护一个在程序启动时可以检查的显示列表)。
一个非 Cocoa 的方法是通过核心图形显示服务:
您必须实现重新配置函数并使用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)
}
NSApplicationDidChangeScreenParametersNotification
? - Martin R