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