CGDisplayCapture и системные ключевые события - PullRequest
1 голос
/ 08 июня 2010

В моем приложении я использую 2 дисплея, один для пользовательского интерфейса и один для рендеринга в полноэкранном режиме NSOpenGLContext.Я фиксирую второй экран с помощью CGDisplayCapture, но этот захват отключает события системных клавиш, как и вкладка tab +.

Есть ли способ повторно включить его или я просто ошибаюсь?

Ответы [ 2 ]

1 голос
/ 08 июля 2010

Насколько мне известно, когда дисплей был захвачен с помощью CGDisplayCapture, все его события клавиш и мыши отключены на этом дисплее.Я не думаю, что вы можете включить их снова, не отпуская дисплей.

0 голосов
/ 28 июня 2017

Это очень старая тема, но недавно у меня возникла эта проблема, и я нашел решение, которое работает (нашел его в каком-то старом примере кода 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()
...