Я хочу создать приложение, которое заставит пользователя сделать перерыв на определенное время. Я не могу найти способ сделать это. До сих пор я собирался использовать 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()
Не имеет значения, какая маска для события установлена, обратный вызов является триггером только из действия мыши.
Так что мой вопрос разделен на две части:
- Почему выше код не срабатывает на KeyDown
- Есть ли другой способ достижения этой задачи?
Спасибо.
Является ли текущий runloop основной runloop? В Objective-C мне нужно преобразовать каждый тип события в маску с помощью 'CGEventMaskBit'. – Willeke
Да, это главная рабочая зона. Если я использую CGEventMaskBit, eventTap имеет значение null. –
Основная рабочая зона уже запущена. Как вы используете 'CGEventMaskBit'? – Willeke