不能CGEventTapCreate

时间:2016-08-29 16:36:07

标签: swift xcode macos accessibility cgeventtap

我从命令行工具项目中的main.swift下面的链接复制并粘贴了代码。 How do you use CGEventTapCreate in Swift?
它构建没有错误,但是当我运行时,警告让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()

1 个答案:

答案 0 :(得分:0)

如果您使用 Swift3 ,则CGEventTap常量应以小写字母开头。例如:

.CGSessionEventTap应为.cgSessionEventTap

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

要从Xcode运行,您需要将 Xcode.app 添加到:系统偏好设置&gt;安全与安全隐私面板(不是您正在构建的应用程序)。

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