如何判断CGEvent触发的操作何时完成?

时间:2012-08-06 21:15:57

标签: macos cocoa

我正在使用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 () ()))))

1 个答案:

答案 0 :(得分:1)

如何将自定义事件类型队列作为标记插入?等到那个事件触发了你自己的一些代码 - 这可能足以说明你发布的所有先前事件都已被处理......