3

コマンド ライン ツール プロジェクトの main.swift の下のリンクからコードをコピーして貼り付けました。 Swift で CGEventTapCreate をどのように使用しますか?
エラーなしでビルドされますが、実行すると、guard let eventTap = CGEventTapCreate... が失敗します。eventTap は CGEventTapCreate から nill を取得すると思います。
システム環境設定 > セキュリティとプライバシー > アクセシビリティでアプリが許可されていないためだと思います。ただし、アクセシビリティ カテゴリでアプリを許可するという通知は表示されません。それをトリガーするには、プロジェクト設定で何かを設定する必要がありますか? ただし、コマンドラインから実行します。何らかの理由で 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()
4

1 に答える 1