2017-01-30 5 views
1

Ich möchte eine App machen, die den Benutzer zwingt für eine bestimmte Zeit eine Pause zu machen. Ich kann keinen Weg finden, das zu tun. Bis jetzt wollte ich CGEvent verwenden, um eine Benachrichtigung zu erhalten, wenn eine Taste gedrückt wird, aber nur für die Mauseingabe arbeiten.Wie deaktiviere ich Tastatureingaben in 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() 

Egal welche Ereignismaske gesetzt ist, Callback wird nur von der Mausaktion ausgelöst.

So ist meine Frage in zwei Teile gespalten:

  1. oben Code Warum nicht auf keydown
  2. auslöst Ist eine andere Möglichkeit, diese Aufgabe zu erreichen?

Danke.

+0

Ist der aktuelle Runloop der Haupt Runloop? In Objective-C muss ich jeden Ereignistyp mit 'CGEventMaskBit' in eine Maske umwandeln. – Willeke

+0

Ja ist die Haupt-Runloop. Wenn ich CGEventMaskBit verwende, ist die EventTap null. –

+0

Der Haupt-Runloop läuft bereits. Wie benutzt man 'CGEventMaskBit'? – Willeke

Antwort

0

Sie können dies mit CGEventTap tun, aber es erfordert, dass die Anwendung Barrierefreiheitsberechtigungen in "Systemeinstellungen - Sicherheit & Datenschutz - Datenschutz - Zugänglichkeit" erteilt wird.

Ein vollständiges Beispiel finden Sie unter this answer.

Wenn Sie Hilfe benötigen, um dies in Swift umzuwandeln, lassen Sie es mich wissen.