0

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

1 回答 1

1

插入自定义事件类型队列作为标记怎么样?等到该事件触发您自己的一些代码 - 这可能足以表明您之前发布的所有事件都已处理......

于 2012-08-06T21:20:16.293 回答