2014-08-29 10 views
5

Ich versuche, eine Schaltfläche mit Aufrufmuster klicken.Microsoft UI-Automatisierung: Invoke Pattern Exception

InvokePattern ipAddMPButton = (InvokePattern)aeAddMPButton.GetCurrentPattern(InvokePattern.Pattern); 
     try 
     { 
      ipAddMPButton .Invoke(); 
     } 
     catch (System.Runtime.InteropServices.COMException e) 
     { 
      // TODO 
     } 

Es wirft COMException und ich kann nicht herausfinden, warum?

Wenn ich diesen Code ausführen, ist die Schaltfläche tatsächlich gedrückt und die Funktionalität funktioniert gut. Aber dann hält es einfach für einige Zeit an und löst diese Ausnahme aus.

+0

Auch, wenn es ist.Aktiv ausführen, dann warum kümmern sich nur die Ausnahme fangen und mit dem Fluss wie geht weiter .... Dies ist nur für den Fall, wo Sie nicht eine feste Lösung erhalten –

+0

Ich habe eigentlich das gleiche Verhalten in einer Anwendung versuche ich mit UIAutomation zu manipulieren. In meinem Fall geschieht dies mit Winforms-Schaltflächen, die Winforms-Dialoge öffnen (ich glaube, dass sie Meldungsfelder sein können). Der aufrufende Thread bleibt für genau 1 Minute hängen und löst dann die Ausnahme aus "0x80040201 - Ein Ereignis konnte keinen der Abonnenten aufrufen." Ich habe diese Tasten mit dem Tool Inspect.exe getestet und während ich die Ausnahme nicht sehen kann, zeigt es ähnliches Verhalten, nämlich friert eine Minute nach dem Aufruf von Invoke ein (obwohl der Aufruf korrekt ausgeführt wird). –

+0

Ist es ein Standard Winforms Button oder ist es eine spezielle Sache? Haben Sie einen Reproduktionscode? 0x80040201 ist UIA_E_ELEMENTNOTAVAILABLE, es kann also ein Problem mit dem Rennzustand sein, wie ein Code (in der App) den Knopf zu früh zerstört, bevor alle Kommunikation zwischen Ihrer UIA App und der Ziel-App abgeschlossen ist. –

Antwort

1

Try Überprüfung aeAddMPButton.GetAllSupportedPatterns() und dann versuchen, dann Aufruf ..

+0

zurückgegeben Hat das irgendeine rationale Erklärung oder ist es nur ein "Klopfe auf Holz" Art von Charme? –

+0

Ein Aufruf von GetAllSupportedPatterns() gibt alle unterstützten Muster für das Element zurück. Die obige Ausnahme wird ausgelöst, wenn die Ausnahme nicht unterstützt wird oder (in seltenen Fällen) keine Muster geladen werden. Die generierte Liste stellt sicher, dass Sie nur geladene/unterstützte Muster durchqueren, wodurch die Möglichkeit des Auftretens ungültiger Muster ausgeschlossen wird. –

+0

Sie sind richtig, aber ich glaube, dass das Problem in diesem Fall kein nicht unterstütztes Muster ist Der Knopf kommt nicht vom Anruf zurück, wie ich in meiner Antwort unten zitiert habe. Wäre das Muster nicht unterstützt worden, wäre die Ausnahme nicht abgefangen worden, da das GetCurrentPattern die Ausnahme ausgelöst hätte und sich außerhalb des try-Blocks befände. –

2

Eigentlich habe ich festgestellt, dass dies bereits hier beschrieben wird: https://social.msdn.microsoft.com/Forums/en-US/673bba3d-27b3-4374-b049-0d2e8ec5e462/hang-with-invokepattern-invoke-in-virtual-pc?forum=windowsaccessibilityandautomation. Zusammenfassend lässt sich sagen, dass Winforms das Öffnen des modalen Dialogs nicht gut mit UIAutomation abläuft, da es nicht vom Befehl Invoke zurückkommt und nur den modalen Dialog erzeugt, der es natürlich daran hindert, den Vorgang abzuschließen. Die vorgeschlagene Lösung besteht darin, einen Hintergrund-Thread zu generieren und Invoke (oder eine andere Operation) von diesem Thread zu aktivieren. Ich schlage auch vor, eine Art Timeout für den Abschluss der Operation zu erzwingen, da es unter Umständen sehr langwierig sein kann.