프로그래밍 방식으로 키보드 및 마우스 이벤트를 게시하려면 CGEventPost()
을 사용하고 있습니다. 이러한 이벤트는 다른 이벤트/액션을 트리거하게됩니다 (예 : 특정 창이 활성화되고, 버튼이 눌려지고, 텍스트 필드에 글자가 입력 됨). 스레드를 동기화하기 위해 특정 CGEvent
에 의해 트리거 된 모든 이벤트가 처리를 완료했는지 알고 싶습니다.CGEvent에 의해 트리거 된 작업이 완료된 시점을 알려주는 방법은 무엇입니까?
모두 CGEventPost()
은 단일 응용 프로그램의 단일 창에서 작동합니다.
는 편집 :
Nielsbot의 솔루션은 잘했다. 나는 CCL을위한 MCL의 이벤트 디스패치 기능의 대략적인 구현으로 끝 맺었다. 이 기능은 코코아 실행 프로세스 루프의 모든 현재 이벤트가 실행될 때까지 차단됩니다. 모든 키보드 및 마우스 이벤트는이 스레드에서 실행되는 작업을 트리거하므로 결국이 방법을 사용할 수 있습니다.
이것이 유일한 걱정은 이벤트 디스패치가 'before'로 호출되어 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()()))))
예; 나쁘지 않네; 그 커스텀 이벤트가 nsrunloop이 무엇인가를하도록 트리거하는 한, 적어도 nsrunloop 스레드가 첫 번째 이벤트를 처리했다는 것을 알게 될 것입니다. 즉, 사용자 정의 이벤트가 기본 이벤트 전에 nsrunloop에 들어 가지 않는 한. –
'** CFRunLoopObserver'도 체크 아웃 할 수 있습니다. ** 이벤트 루프를 실행 한 직후에 **에 대한 트리거 유형을 찾을 수는 없지만, 그 전에는 트리거가 문서에 따라 트리거되지 않을 수도 있습니다. – nielsbot
제안 해 주셔서 감사합니다. 나는 너의 첫번째 생각을 가지고 갔다. –