我正在使用CGEventPost()
以编程方式发布键盘和鼠标事件。这些事件将最终触发其他事件/动作(例如,某些窗口变为活动状态,按下按钮,在文本字段中输入字母)。为了同步线程,我想知道特定CGEvent
触发的所有事件何时完成处理。
所有CGEventPost()
将最终作用于单个应用程序的单个窗口。
编辑:
Nielsbot的解决方案运作得很好。我最终大致实现了MCL的CCL事件调度功能。此函数将阻塞,直到Cocoa运行进程循环中的所有当前事件都已完成执行。由于所有键盘和鼠标事件都会触发在此线程上运行的操作,因此这种方法可以正常工作。
我唯一担心的是事件调度在CGEvent在事件循环中触发一个动作之前调用,但我的测试目前显示没有发生这种情况。所以我现在正在使用这个解决方案。
就像FYSA一样,对于一个已发布的事件来说似乎需要保守的1ms才能达到运行循环,至少在我的设置上是这样。
(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 () ()))))
答案 0 :(得分:1)
如何将自定义事件类型队列作为标记插入?等到那个事件触发了你自己的一些代码 - 这可能足以说明你发布的所有先前事件都已被处理......