【问题标题】:Can't CGEventTapCreate不能 CGEventTapCreate
【发布时间】:2016-08-29 16:36:06
【问题描述】:

我从命令行工具项目中 main.swift 下面的链接复制并粘贴了代码。 How do you use CGEventTapCreate in Swift?
它构建没有错误,但是当我运行时,guard let eventTap = CGEventTapCreate... 失败。我认为 eventTap 从 CGEventTapCreate 中获取为零。
我假设是因为系统偏好设置>安全和隐私>可访问性中不允许该应用程序。不过,我没有收到允许该应用程序进入可访问性类别的通知。我需要在项目设置中设置一些东西来触发它吗? 它虽然从命令行运行。由于某种原因,我无法从 xCode 运行。 这是上面链接中稍作修改的代码。

import Foundation

func myCGEventCallback(proxy : CGEventTapProxy, type : CGEventType, event : CGEvent, refcon : UnsafeMutablePointer<Void>) -> Unmanaged<CGEvent>? {
    if [.KeyDown , .KeyUp].contains(type) {
        var keyCode = CGEventGetIntegerValueField(event, .KeyboardEventKeycode)
        print(keyCode)
        if keyCode == 0 {
            keyCode = 6
        } else if keyCode == 6 {
            keyCode = 0
        }
        CGEventSetIntegerValueField(event, .KeyboardEventKeycode, keyCode)
    }
    return Unmanaged.passRetained(event)
}

let eventMask = (1 << CGEventType.KeyDown.rawValue) | (1 << CGEventType.KeyUp.rawValue)
guard let eventTap = CGEventTapCreate(.CGSessionEventTap, .HeadInsertEventTap, .Default, CGEventMask(eventMask), myCGEventCallback, nil)
else {
        print("failed to create event tap")
        exit(1)
}

let runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0)
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes)
CGEventTapEnable(eventTap, true)
CFRunLoopRun()

【问题讨论】:

    标签: swift xcode macos accessibility cgeventtap


    【解决方案1】:

    如果您使用的是 Swift3,那么 CGEventTap 常量应该以小写字母开头。例如:

    .CGSessionEventTap 应该是.cgSessionEventTap

    .keyDown.keyUp.headInsertEventTap 等也是如此……

    为了从 Xcode 运行,您需要将 Xcode.app 添加到:System Preferences > Security & Privacy 面板(不是您正在构建的应用程序)。

    在没有 Xcode 的情况下运行,您需要通过从您的applicationDidFinishLaunching 方法调用isProcessTrusted 使您的应用成为受信任的无障碍客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-15
      • 2015-10-31
      • 1970-01-01
      • 2011-02-27
      • 2016-06-06
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多