2017-01-30 4 views
2

Я пытаюсь использовать функцию Carbon RegisterEventHotKey, чтобы создать горячую клавишу, когда нажата клавиша команды. Я использую его так:Обнаружение нажатия клавиши глобального модификатора в Swift

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

Однако это не вызывает handler, когда я использую только ключ командной строки. Обработчик вызывается, если я заменяю cmdKey любым другим кодом кода, не являющимся модификатором.

Есть ли у кого-нибудь предложения, которые позволят приложению распознавать глобально при нажатии клавиши команды? Благодарю.

ответ

4

Вы можете добавить глобальный монитор для событий, соответствующий .flagsChanged, контроллеру вашего вида, чтобы вы могли проверить его пересечение модификатораFlags с помощью 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

Amazing. Моя предыдущая реализация немного изменилась, когда я проверил. Твой работает как шарм. Спасибо! – user3225395

Смежные вопросы