2012-11-26 17 views
8

Sto sviluppando un'applicazione in C++ che utilizza UIAutomation per ricevere notifiche di eventi significativi relativi all'interazione dell'utente. Ho provato il gestore anevent chiamando AddAutomationEventHandler a essere ascoltato per gli eventi di apertura della finestra, ma sto avendo problemi a fermare la notifica e la pulizia prima di uscire. Se l'utente ha avviato determinate applicazioni, come Firefox, la chiamata a RemoveAutomationEventHandlerhangs. (Anche chiamare RemoveAllEventHandlers si blocca in questo caso.) Si noti che tutte le chiamate per aggiungere o rimuovere i gestori di eventi vengono eseguite nel contesto dello stesso thread non dell'interfaccia utente.IUIAutomation :: RemoveAllEventHandlers si blocca

Nota: sto vedendo questo comportamento su Windows 7 e Windows 8.

Delle idee su perché questo sta accadendo o come risolvere il problema? Cosa rende la struttura modificata evento diverso da tutti gli altri?

risposta

3

Gli eventi di apertura/chiusura della finestra vengono implementati tramite i gestori WinEvent del kernel; gli eventi di modifica della struttura coinvolgono l'app del cliente. I tuoi messaggi di pompa thread non-ui? UI Automation ha bisogno di pompare messaggi per far funzionare le comunicazioni cross-process.

+1

Puoi chiarire un po 'di più sulla necessità di inviare messaggi? Stai parlando di messaggi di Windows? Come si dovrebbe fare questo e non tutte le chiamate e gli eventi di UiAutomation sono sostanzialmente incrociati? –

+1

@o_weisman In particolare, i thread di apartment a thread singolo (STA) devono pompare i messaggi di Windows per ottenere chiamate COM in entrata inviate nel thread. Se hai inserito il thread nel MTA (o stai utilizzando il codice gestito, che è più o meno la stessa cosa), le chiamate COM in arrivo possono essere inviate a qualsiasi thread in attesa nel MTA. E sì, la maggior parte delle chiamate e degli eventi di UI Automation sono sostanzialmente incrociati. –

+1

Ciao Eric, grazie per la risposta. A differenza dell'OP, sto sviluppando utilizzando le librerie C# gestite di UI Automation e, tuttavia, sto sperimentando blocchi simili in RemoveAllEventHandlers a volte. Ciò che è ancora più peculiare, sto vedendo ritardi molto lunghi (in minuti) tra l'apertura di Windows Winforms nell'applicazione testata e il richiamo del gestore di WindowOpened di UI Automation. Hai mai incontrato simili comportamenti? –