2017-01-30 2 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 имеет значение null. –

+0

Основная рабочая зона уже запущена. Как вы используете 'CGEventMaskBit'? – Willeke

ответ

0

Вы можете сделать это с помощью CGEventTap, но для этого требуется, чтобы приложению были предоставлены разрешения на доступ в «Системные настройки - Безопасность & Конфиденциальность - Конфиденциальность - Доступность».

См. this answer для получения полного примера.

Если вам нужна помощь в преобразовании этого в Swift, дайте мне знать.

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