2016-08-29 10 views
1

コマンドラインツールプロジェクトのmain.swift以下のリンクからコードをコピーして貼り付けました。 How do you use CGEventTapCreate in Swift?
これはエラーなしでビルドされますが、実行すると、guardはeventTap = CGEventTapCreate ...が失敗します。私はeventTapがCGEventTapCreateからnillを取得すると思います。
システムの設定>セキュリティとプライバシー>アクセシビリティではアプリが許可されていないと考えます。私はアクセシビリティカテゴリのアプリを許可する通知を取得しません。それを引き起こすためにプロジェクト設定で何かを設定する必要がありますか? これはコマンドラインから実行されます。何らかの理由でxCodeから実行できません。 上記のリンクから少し変更されたコードです。Can not CGEventTapCreate

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() 

答えて

0

あなたはSwift3を使用している場合は、CGEventTap定数は小文字で始める必要があります。たとえば:

.CGSessionEventTap.cgSessionEventTap

同じで.keyDown.keyUp.headInsertEventTap、などについても同様である必要があり、...のXcodeから実行するために

は、あなたがのXcodeを追加する必要があります。アプリに:システム環境設定>セキュリティ&プライバシーパネル(ビルドしているアプリではありません)。 Xcodeのなしを実行するには

、あなたのapplicationDidFinishLaunching方法からisProcessTrustedを呼び出すことによって、あなたのアプリケーションの信頼できるユーザー補助クライアントを作成する必要があります。