2014-08-29 15 views
5

Sto provando a fare clic su un pulsante utilizzando invoke pattern.Microsoft UI Automation: Invoke Pattern Exception

Getta COMException e non riesco a capire perché?

Quando si esegue questo codice, il pulsante viene effettivamente premuto e la funzionalità funziona correttamente. Ma poi si ferma per un po 'e lancia questa eccezione.

+0

Inoltre, se si tratta di un'operazione effettivamente funzionante, allora perché preoccuparsi di catturare l'eccezione e procedere con il flusso come è .... Questo è nel caso in cui non si ottiene una soluzione solida come la roccia –

+0

Ho effettivamente lo stesso comportamento in un'applicazione che sto tentando di manipolare con UIAutomation. Nel mio caso, questo succede con i pulsanti Winform che aprono le finestre di dialogo di Winforms (credo che possano essere finestre di messaggi). Il thread chiamante si blocca per esattamente 1 minuto e quindi genera l'eccezione "0x80040201 - Un evento non è stato in grado di richiamare nessuno degli abbonati." Ho testato questi pulsanti con lo strumento Inspect.exe e mentre non riesco a vedere l'eccezione, mostra un comportamento simile, vale a dire blocca per un minuto dopo aver chiamato Invoke (anche se l'invocazione viene eseguita correttamente). –

+0

È un pulsante Winforms standard o è una cosa speciale? Hai qualche codice di riproduzione? 0x80040201 è UIA_E_ELEMENTNOTAVAILABLE, quindi potrebbe trattarsi di un problema relativo alle condizioni della competizione, come se alcuni codici (nell'app) distruggessero il pulsante troppo presto prima che tutte le comunicazioni fossero terminate tra l'app UIA e l'app di destinazione. –

risposta

1

Prova a controllare aeAddMPButton.GetAllSupportedPatterns() e quindi provare a lanciare poi ..

+0

Questo ha qualche spiegazione razionale o è solo un tipo di incantesimo "knock on wood"? –

+0

Una chiamata a GetAllSupportedPatterns() restituisce tutti i modelli supportati per l'elemento. L'eccezione di cui sopra viene generata quando l'eccezione non è supportata o (in rari casi) i pattern non vengono caricati. L'elenco generato si assicura che attraversi solo i modelli caricati/supportati, evitando così la possibilità di generare un'eccezione di pattern non valida –

+0

Sei corretto, ma credo che in questo caso il problema non sia un pattern non supportato ma piuttosto un caso di il pulsante non ritorna dalla chiamata Invoke come ho citato nella mia risposta di seguito. Se il pattern non fosse supportato, l'eccezione non sarebbe stata rilevata poiché GetCurrentPattern avrebbe generato l'eccezione ed è al di fuori del blocco try. –

2

realtà ho scoperto che questo è già discusso qui: https://social.msdn.microsoft.com/Forums/en-US/673bba3d-27b3-4374-b049-0d2e8ec5e462/hang-with-invokepattern-invoke-in-virtual-pc?forum=windowsaccessibilityandautomation. Per riassumere, l'apertura di Winform della finestra di dialogo modale non funziona bene con UIAutomation in quanto non ritorna dal comando Invoke e crea solo la finestra di dialogo modale che ovviamente impedisce di completare l'operazione. La soluzione proposta è generare un thread in background e attivare Invoke (o qualsiasi altra operazione) da quel thread. Suggerisco inoltre di applicare una sorta di timeout per il completamento dell'operazione in quanto può essere lunga in alcune circostanze.