0

CGEventPost()プログラムでキーボードとマウスのイベントを投稿するために使用しています。これらのイベントは、他のイベント/アクションをトリガーすることになります (たとえば、特定のウィンドウがアクティブになる、ボタンが押される、テキスト フィールドに文字が入力されるなど)。スレッドを同期するために、特定のイベントによってトリガーされたすべてのイベントの処理がいつ終了したかを知りたいCGEventです。

すべてCGEventPost()の は、1 つのアプリケーションの 1 つのウィンドウで動作することになります。

編集:

Nielsbot のソリューションは問題なく機能しました。最終的に、CCL 用の MCL のイベント ディスパッチ関数の大まかな実装になりました。この関数は、Cocoa 実行プロセス ループ内の現在のすべてのイベントの実行が完了するまでブロックします。キーボードとマウスのすべてのイベントは、最終的にこのスレッドで実行されるアクションをトリガーするため、このアプローチは問題なく機能します。

これに関する私の唯一の懸念は、CGEvent がイベント ループでアクションをトリガーする「前に」イベント ディスパッチが呼び出されることですが、私のテストでは現在、これが発生していないことが示されています。したがって、私は今のところこのソリューションを使用しています。

参考までに、少なくとも私のセットアップでは、投稿されたイベントが実行ループに到達するまでに控えめに 1 ミリ秒かかるようです。

(defun event-dispatch ()
  (with-shadow (gui::queue-for-event-process
                 (lambda (f &key at-start)
                   (declare (ignore at-start)) 
                   (funcall fun-orig f :at-start nil))) 
    (gui::call-in-event-process (lambda () ()))))
4

1 に答える 1

1

カスタム イベント タイプのキューをマーカーとして挿入するのはどうですか? そのイベントが独自のコードの一部をトリガーするまで待ちます。これにより、投稿された以前のすべてのイベントが処理されたことを十分に示すことができます...

于 2012-08-06T21:20:16.293 に答える