2017-01-30 11 views
2

Carbon의 기능 RegisterEventHotKey을 사용하여 명령 키를 눌렀을 때 단축키를 만들려고합니다. 그래서처럼 사용하고 있습니다 : 난 단지 명령 키를 사용할 때Swift에서 글로벌 수정 자 키 누르기 검색

InstallEventHandler(GetApplicationEventTarget(), handler, 1, &eventType, nil, nil) 
RegisterEventHotKey(UInt32(cmdKey), 0, hotKeyID, GetApplicationEventTarget(), 0, &hotKeyRef) 

그러나, 그것은 handler를 호출하지 않습니다. cmdKey을 다른 비 수정 자 키 코드로 바꾸면 처리기가 호출됩니다.

누군가가 명령 키를 눌렀을 때 앱이 전체적으로 인식 할 수 있도록하는 제안이 있습니까? 감사.

답변

4

.flagsChanged과 일치하는 이벤트를보기 컨트롤러에 추가하여 modifierFlags와의 교차를 deviceIndependentFlagsMask와 비교하고 결과 키를 확인할 수 있습니다.

선언

class func addGlobalMonitorForEvents(matching mask: NSEventMask, handler block: @escaping (NSEvent) -> Void) -> Any? 

다른 응용 프로그램에 게시 된 이벤트의 복사본을 수신하는 이벤트 모니터를 설치합니다. 이벤트는 앱 에 비동기 적으로 전달되며 이벤트 만 관찰 할 수 있습니다. 수정하지 않거나 이벤트가 원래 대상인 응용 프로그램으로 전달되지 않도록 할 수는 없습니다. 키 관련 이벤트는 액세스 가능성이 이거나 응용 프로그램이 접근성 액세스 (AXIsProcessTrusted() 참조)에 대해 신뢰되는 경우에만 모니터링 할 수 있습니다. 자신의 응용 프로그램으로 전송되는 이벤트에 대해서는 처리기가 으로 호출되지 않습니다.

import Cocoa 
class ViewController: NSViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     NSEvent.addGlobalMonitorForEvents(matching: .flagsChanged) { 
      switch $0.modifierFlags.intersection(.deviceIndependentFlagsMask) { 
      case [.shift]: 
       print("shift key is pressed") 
      case [.control]: 
       print("control key is pressed") 
      case [.option] : 
       print("option key is pressed") 
      case [.command]: 
       print("Command key is pressed") 
      case [.control, .shift]: 
       print("control-shift keys are pressed") 
      case [.option, .shift]: 
       print("option-shift keys are pressed") 
      case [.command, .shift]: 
       print("command-shift keys are pressed") 
      case [.control, .option]: 
       print("control-option keys are pressed") 
      case [.control, .command]: 
       print("control-command keys are pressed") 
      case [.option, .command]: 
       print("option-command keys are pressed") 
      case [.shift, .control, .option]: 
       print("shift-control-option keys are pressed") 
      case [.shift, .control, .command]: 
       print("shift-control-command keys are pressed") 
      case [.control, .option, .command]: 
       print("control-option-command keys are pressed") 
      case [.shift, .command, .option]: 
       print("shift-command-option keys are pressed") 
      case [.shift, .control, .option, .command]: 
       print("shift-control-option-command keys are pressed") 
      default: 
       print("no modifier keys are pressed") 
      } 
     } 
    } 
} 
+1

놀라운. 이전에 구현 한 내용은 내가 확인한 것과 약간 다릅니다. 너는 매력처럼 작동한다. 정말 고마워! – user3225395