我正在使用CGEventPost()
以编程方式发布键盘和鼠标事件。这些事件最终会触发其他事件/动作(例如,某些窗口变为活动状态、按下按钮、在文本字段中输入字母)。为了同步线程,我想知道由特定触发的所有事件何时CGEvent
完成处理。
所有CGEventPost()
s 最终都将作用于单个应用程序的单个窗口。
编辑:
Nielsbot 的解决方案运行良好。我最终粗略地实现了 MCL 的 CCL 事件调度功能。该函数会一直阻塞,直到 Cocoa 运行过程循环中的所有当前事件都执行完毕。由于所有键盘和鼠标事件最终都会触发在此线程上运行的操作,因此这种方法可以正常工作。
我唯一担心的是事件调度在 CGEvent 触发事件循环中的动作之前被调用,但我的测试目前表明这没有发生。所以我现在正在使用这个解决方案。
只是 FYSA,至少在我的设置中,发布的事件似乎需要保守的 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 () ()))))