2017-01-30 19 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

関連する問題