【发布时间】:2017-06-15 09:35:01
【问题描述】:
我想制作一个可以强制用户在特定时间休息的应用。 我找不到办法做到这一点。到现在为止,我打算使用 CGEvent 在按下一个键时接收通知,但仅适用于鼠标输入。
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将每种事件类型转换为掩码。 -
是的,是主运行循环。如果我使用 CGEventMaskBit,则 eventTap 为空。
-
主运行循环已经在运行。你如何使用
CGEventMaskBit?
标签: swift macos cocoa keyboard