8
我正在开发一个使用UIAutomation接收与用户交互相关重要事件通知的C++应用程序。我通过调用AddAutomationEventHandler来侦听事件处理程序来侦听窗口打开的事件,但我在退出之前停止通知和清理时遇到问题。如果用户启动了某些应用程序(例如Firefox),则调用RemoveAutomationEventHandlerhangs。 (在这种情况下,调用RemoveAllEventHandlers也会挂起。)请注意,添加或删除事件处理程序的所有调用均在同一个非UI线程的上下文中完成。IUIAutomation :: RemoveAllEventHandlers挂起
注:我看到在Windows 7和Windows 8
为什么这种情况正在发生或如何解决它的任何意见这种行为?是什么让结构改变了事件与其他事物不同?
你能澄清一点关于泵送信息的需要吗?你在谈论Windows消息吗?应该如何去做这件事,并不是所有的UiAutomation调用和事件基本上都是跨进程的? –
@ o_weisman特别是,单线程单元(STA)线程必须泵送windows消息才能获得传入COM线程的传入调用。如果你已经把你的线程放到MTA中(或者你使用的是托管代码,这或多或少是一样的东西),那么可以将传入的COM调用分派给MTA中的任何等待线程。是的,大多数UI自动化调用和事件基本上是跨进程的。 –
嗨,埃里克,谢谢你的回应。与OP不同的是,我正在使用UI自动化的托管C#库进行开发,但我仍然经常在RemoveAllEventHandlers中遇到类似的挂起问题。更奇怪的是,我看到在测试的应用程序中打开Winforms窗口和调用我的UI自动化WindowOpened处理程序之间非常长的延迟(以分钟为单位)。曾经遇到过这样的行为? –