CGDisplayCapture和系统键事件

时间:2010-06-07 21:42:43

标签: cocoa fullscreen

在我的应用中,我使用2个显示,一个用于UI,一个用于使用全屏NSOpenGLContext进行渲染。我使用CGDisplayCapture捕获第二个显示,但此捕获会禁用系统键事件,就像⌘+ tab一样。

有没有办法重新启用它,或者我只是犯了错误?

2 个答案:

答案 0 :(得分:1)

据我所知,当使用CGDisplayCapture捕获显示时,在该显示器上禁用所有键和鼠标事件。我不认为你可以在不释放显示器的情况下再次启用它们。

答案 1 :(得分:0)

这是一个非常老的线程,但我最近遇到了这个问题并找到了一个有效的解决方案(在一些旧的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()