【问题标题】:How to disable keyboard input in macOs?如何在 macOS 中禁用键盘输入?
【发布时间】: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()

无论设置什么事件掩码,回调仅由鼠标操作触发。

所以我的问题分为两部分:

  1. 为什么上面的代码不会在 keydown 时触发
  2. 还有其他方法可以完成这项任务吗?

谢谢。

【问题讨论】:

  • 当前的runloop是主runloop吗?在 Objective-C 中,我必须使用 CGEventMaskBit 将每种事件类型转换为掩码。
  • 是的,是主运行循环。如果我使用 CGEventMaskBit,则 eventTap 为空。
  • 主运行循环已经在运行。你如何使用CGEventMaskBit

标签: swift macos cocoa keyboard


【解决方案1】:

您可以使用CGEventTap 执行此操作,但它要求应用程序在“系统偏好设置 - 安全和隐私 - 隐私 - 可访问性”中获得可访问权限。

完整示例请参见this answer

如果您在将其转换为 Swift 时需要帮助,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2012-09-12
    相关资源
    最近更新 更多