2017-01-30 13 views
1

私は、ユーザーが特定の時間だけ休憩をとるようなアプリを作りたいと思っています。 私はそれを行う方法を見つけることができません。これまでは、CGEventを使用して、キーが押されたときに通知を受信しようとしていましたが、マウス入力でのみ動作しました。macOsでキーボード入力を無効にする方法は?

let eventMask = CGEventType.keyDown.rawValue //| (1 << CGEventType.keyUp.rawValue) 
    guard let eventTap = CGEvent.tapCreate(tap: .cgSessionEventTap, 
              place: .headInsertEventTap, 
              options: .defaultTap, 
              eventsOfInterest: CGEventMask(eventMask), 
              callback: myCGEventCallback, 
              userInfo: nil) else { 
              print("failed to create event tap") 
              exit(1) 
    } 




    let runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0) 
    CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, .commonModes) 
    CGEvent.tapEnable(tap: eventTap, enable: true) 
    CFRunLoopRun() 

どのようなイベントマスクが設定されても問題はありませんが、コールバックはマウスの操作からのみトリガされます。

だから私の質問は2つに分割されています。なぜコードの上

  1. のKeyDown
  2. でトリガしませんが、そのタスクを達成するための他の方法ですか?

ありがとうございます。

+0

現在のランループがメインランループですか? Objective-Cでは、 'CGEventMaskBit'を使って各イベントタイプをマスクに変換する必要があります。 – Willeke

+0

はい、メインrunloopです。 CGEventMaskBitを使用すると、eventTapはnullになります。 –

+0

メインrunloopはすでに実行されています。あなたは 'CGEventMaskBit'をどのように使っていますか? – Willeke

答えて

0

これはCGEventTapを使用して行うことができますが、アプリケーションに「システム環境設定 - セキュリティ&プライバシー - プライバシー - アクセシビリティ」のアクセシビリティ権限が必要です。

完全な例については、this answerを参照してください。

これをSwiftに変換する手助けが必要な場合は、教えてください。

関連する問題