2017-01-30 16 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() 

無論設置了什麼事件掩碼,回調僅從鼠標動作觸發。

所以我的問題是一分爲二:

  1. 爲什麼上面的代碼不上的keydown
  2. 觸發器是任何其他方式來實現這一任務?

謝謝。

+0

目前的runloop是主要的runloop?在Objective-C中,我必須使用'CGEventMaskBit'將每個事件類型轉換爲一個掩碼。 – Willeke

+0

是的主循環。如果我使用CGEventMaskBit,則eventTap爲空。 –

+0

主要的runloop已經在運行。你如何使用'CGEventMaskBit'? – Willeke

回答

0

您可以使用CGEventTap來做到這一點,但它要求應用程序在「系統首選項 - 安全&隱私 - 隱私 - 輔助功能」中具有可訪問性權限。

查看this answer的完整示例。

如果您需要幫助將其轉換爲Swift,請告訴我。