2017-11-13 2 views
1

SOおよびその他の例を使用してCGEventタップを作成する方法を学習しようとしています。CGEventを正しい方法で作成する

は、私が使用して、イベントのタップを作成する方法を知っている:私は

let runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0) 
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, .commonModes) 

一部を実行した後

let eventTap = CGEvent.tapCreate(*/arguments to create the tap*/) 

ではなく、私が見つけたすべての例では、オンラインでも、次の2行を追加します

CGEvent.tapEnable(tap: eventTap, enable: true) 
CFRunLoopRun() 

最後の2行を追加すると便利であるかどうかを簡単に説明できますか?

答えて

1

最初は簡単です:the docsは言う:作成したときにタップが正常に有効になっている

イベント。イベントタップが応答しなくなった場合、またはユーザーがイベントタップを無効にするよう要求した場合は、kCGEventTapDisabledイベントがイベントタップコールバック関数に渡されます。イベントタップは、この関数を呼び出すことで再度有効にすることができます。

もう一つは、プログラムがrun loop(現在のスレッドに)持っていない場合のために、おそらくです。たとえば、NSApplicationを使用しないコマンドラインプログラムでは、独自の実行ループを作成して実行する必要があります。

+0

すてきな説明をありがとう。既に実行ループを持っていたプログラムでCFRunLoopRun()を呼び出すと、それは悪いですか? –

+0

"実行ループは再帰的に実行できます。実行ループコールアウト内からCFRunLoopRun()を呼び出して、現在のスレッドのコールスタックでネストされた実行ループアクティベーションを作成できます。したがって、それが「悪い」かどうかは、ネストされた実行ループを必要とするかどうかによって異なります。 – Ssswift

+0

そうですね、後で読むが、「スレッドごとに1つの実行ループがあります。スレッドの実行ループを作成も破棄もしません。」これは最も外側の実行ループを参照しますか? また、イベントタップではどのシナリオでネストされた実行ループが必要ですか? –

関連する問題