2012-11-26 2 views
8

사용자 상호 작용과 관련된 중요한 이벤트 알림을 받기 위해 UIAutomation을 사용하는 C++ 응용 프로그램을 개발 중입니다. AddAutomationEventHandler를 호출하여 anAvent 핸들러를 시도하여 열린 이벤트를 들었지만 알림을 중지하고 종료하기 전에 정리하는 데 문제가 있습니다. 사용자가 Firefox와 같은 특정 응용 프로그램을 시작한 경우 RemoveAutomationEventHandlerhangs를 호출합니다. 이 경우 RemoveAllEventHandler 호출도 중단됩니다. 이벤트 처리기를 추가하거나 제거하는 모든 호출은 UI가 아닌 동일한 스레드의 컨텍스트에서 수행됩니다.IUIAutomation :: RemoveAllEventHandlers hangs

참고 : 나는 윈도우 7과 이런 일이 나 해결 방법을하는 이유가 뭘까요

윈도우 8에서이 문제를보고 있어요? 구조 변경 이벤트가 다른 이벤트와 다른 점은 무엇입니까?

답변

3

윈도우 열기/닫기 이벤트는 커널 WinEvent 핸들러를 통해 구현됩니다. 구조 변경 이벤트는 클라이언트 응용 프로그램과 관련됩니다. 귀하의 비 - ui 스레드 펌프 메시지가 있습니까? UI 자동화는 프로세스 간 통신을 위해 메시지를 펌프해야합니다.

+1

메시지를 보내야 할 필요성에 대해 좀 더 명확히 할 수 있습니까? Windows 메시지에 대해 이야기하고 있습니까? 어떻게해야합니까? UiAutomation 호출과 이벤트가 기본적으로 교차 프로세스가 아닌 것은 아닙니까? –

+1

@o_weisman 특히 단일 스레드 아파트 (STA) 스레드는 들어오는 COM 호출을 스레드로 보내려면 Windows 메시지를 펌프해야합니다. 스레드를 MTA에 넣었 으면 (또는 관리 코드를 사용하면 다소 차이가있을 수 있습니다), 들어오는 COM 호출은 MTA의 대기중인 스레드로 전달 될 수 있습니다. 그리고 네, 대부분의 UI 자동화 호출 및 이벤트는 기본적으로 교차 프로세스입니다. –

+1

안녕하세요, 에릭, 응답 해 주셔서 감사합니다. OP와 달리 UI 자동화의 관리되는 C# 라이브러리를 사용하여 개발 중이며 여전히 RemoveAllEventHandlers에서 비슷한 중단이 발생하고 있습니다. 무엇보다 특이한 점은 테스트 된 응용 프로그램에서 Winforms 창을 열 때와 UI Automation WindowOpened 처리기를 호출하는 사이에 매우 긴 지연이 있음을 알 수 있습니다. 그런 행동을 본 적이 있습니까? –

관련 문제