2012-11-26 18 views
8

我正在开发一个使用UIAutomation接收与用户交互相关重要事件通知的C++应用程序。我通过调用AddAutomationEventHandler来侦听事件处理程序来侦听窗口打开的事件,但我在退出之前停止通知和清理时遇到问题。如果用户启动了某些应用程序(例如Firefox),则调用RemoveAutomationEventHandlerhangs。 (在这种情况下,调用RemoveAllEventHandlers也会挂起。)请注意,添加或删除事件处理程序的所有调用均在同一个非UI线程的上下文中完成。IUIAutomation :: RemoveAllEventHandlers挂起

注:我看到在Windows 7和Windows 8

为什么这种情况正在发生或如何解决它的任何意见这种行为?是什么让结构改变了事件与其他事物不同?

回答

3

窗口打开/关闭事件通过内核WinEvent处理程序实现;结构更改事件涉及客户端应用程序。您的非用户线程泵信息是否存在? UI自动化需要抽取消息以使跨进程通信正常工作。

+1

你能澄清一点关于泵送信息的需要吗?你在谈论Windows消息吗?应该如何去做这件事,并不是所有的UiAutomation调用和事件基本上都是跨进程的? –

+1

@ o_weisman特别是,单线程单元(STA)线程必须泵送windows消息才能获得传入COM线程的传入调用。如果你已经把你的线程放到MTA中(或者你使用的是托管代码,这或多或少是一样的东西),那么可以将传入的COM调用分派给MTA中的任何等待线程。是的,大多数UI自动化调用和事件基本上是跨进程的。 –

+1

嗨,埃里克,谢谢你的回应。与OP不同的是,我正在使用UI自动化的托管C#库进行开发,但我仍然经常在RemoveAllEventHandlers中遇到类似的挂起问题。更奇怪的是,我看到在测试的应用程序中打开Winforms窗口和调用我的UI自动化WindowOpened处理程序之间非常长的延迟(以分钟为单位)。曾经遇到过这样的行为? –