2017-01-30 1 views
2

J'essaie d'utiliser la fonction RegisterEventHotKey de Carbon pour créer une touche de raccourci lorsque la touche de commande est enfoncée. Je l'utilise comme ceci:Détection globale de touche de modification dans Swift

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

Cependant, il ne remet pas handler quand je n'utilise que la touche de commande. Le gestionnaire est appelé si je remplace cmdKey par un autre code clé non modifiable.

Est-ce que quelqu'un a des suggestions qui permettraient à l'application de reconnaître globalement quand la touche de commande est enfoncée? Merci.

Répondre

4

Vous pouvez ajouter Global Monitor For Events correspondant .flagsChanged à votre contrôleur de vue afin que vous puissiez vérifier son intersection modifierFlags avec deviceIndependentFlagsMask et vérifier les clés qui en résultent.

Déclaration

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

installe un moniteur d'événements qui reçoit des copies d'événements affichés autres applications. Les événements sont livrés de manière asynchrone à votre application et vous ne pouvez observer que l'événement. vous ne pouvez pas modifier ou empêcher l'événement d'être remis à son application d'origine cible. Les événements liés aux clés peuvent uniquement être surveillés si l'accessibilité est activée ou si votre application est approuvée pour l'accès à l'accessibilité (voir AXIsProcessTrusted()). Notez que votre gestionnaire ne sera pas appelé pour les événements qui sont envoyés à votre propre application.

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

Incroyable. Ma mise en œuvre précédente était un peu différente maintenant que j'ai vérifié. Le vôtre fonctionne comme un charme. Merci beaucoup! – user3225395