2012-08-06 3 views
0

프로그래밍 방식으로 키보드 및 마우스 이벤트를 게시하려면 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()())))) 

답변

1

마커로 맞춤 이벤트 유형 대기열을 삽입하는 방법은 무엇입니까? 해당 이벤트가 자신의 코드를 트리거 할 때까지 기다리십시오 - 이것은 사용자가 게시 한 모든 이전 이벤트가 처리되었음을 나타내는 충분한 정보를 제공 할 수 있습니다 ...

+0

예; 나쁘지 않네; 그 커스텀 이벤트가 nsrunloop이 무엇인가를하도록 트리거하는 한, 적어도 nsrunloop 스레드가 첫 번째 이벤트를 처리했다는 것을 알게 될 것입니다. 즉, 사용자 정의 이벤트가 기본 이벤트 전에 nsrunloop에 들어 가지 않는 한. –

+0

'** CFRunLoopObserver'도 체크 아웃 할 수 있습니다. ** 이벤트 루프를 실행 한 직후에 **에 대한 트리거 유형을 찾을 수는 없지만, 그 전에는 트리거가 문서에 따라 트리거되지 않을 수도 있습니다. – nielsbot

+0

제안 해 주셔서 감사합니다. 나는 너의 첫번째 생각을 가지고 갔다. –

관련 문제