【发布时间】:2011-02-28 22:04:06
【问题描述】:
在我的应用程序中,我使用 2 个显示,一个用于 UI,一个用于全屏渲染NSOpenGLContext。我使用CGDisplayCapture 捕获第二个显示,但此捕获禁用系统键事件,就像 ⌘ + tab 一样。
有没有办法重新启用它还是我弄错了?
【问题讨论】:
标签: cocoa fullscreen
在我的应用程序中,我使用 2 个显示,一个用于 UI,一个用于全屏渲染NSOpenGLContext。我使用CGDisplayCapture 捕获第二个显示,但此捕获禁用系统键事件,就像 ⌘ + tab 一样。
有没有办法重新启用它还是我弄错了?
【问题讨论】:
标签: cocoa fullscreen
据我所知,当使用 CGDisplayCapture 捕获显示时,该显示上的所有键和鼠标事件都被禁用。我认为您不能在不释放显示的情况下再次启用它们。
【讨论】:
这是一个非常古老的线程,但我最近遇到了这个问题并找到了一个可行的解决方案(在一些旧的 Obj-C Apple 示例代码中找到了它)。看来解决方案是自己获取事件,而不是让操作系统将它们传递给您。这是我正在使用的 Swift 3 版本(请注意,可能有一些更优化的方式来编写此代码,但它似乎对我有用):
CGCaptureAllDisplays()
// Show full screen captured display until Escape key is pressed.
var isInFullScreen = true
while (isInFullScreen) {
autoreleasepool {
while let event = NSApp.nextEvent(matching: .any, until: Date.distantPast, inMode: .defaultRunLoopMode, dequeue: true) {
switch event.type {
case .keyDown:
if let key = event.charactersIgnoringModifiers {
if key == "\u{001B}" {
// Escape key pressed.
print("ESCAPE")
isInFullScreen = false
break
}
}
default:
print("<unknown event>")
break
}
}
}
}
CGReleaseAllDisplays()
【讨论】: