2012-11-26 10 views
8

Ich entwickle eine App in C++, die UIAutomation verwendet, um Benachrichtigung über wichtige Ereignisse im Zusammenhang mit Benutzerinteraktion zu erhalten. Ich habe einen Event-Handler ausprobiert, indem ich AddAutomationEventHandler aufgerufen habe, um nach Fenster-geöffneten Ereignissen zu hören, aber ich habe Probleme, die Benachrichtigung zu stoppen und vor dem Beenden zu bereinigen. Wenn der Benutzer bestimmte Anwendungen wie Firefox gestartet hat, wird der Aufruf von RemoveAutomationEventHandlerhangs aufgerufen. (Der Aufruf von RemoveAllEventHandlers hängt in diesem Fall ebenfalls.) Beachten Sie, dass alle Aufrufe zum Hinzufügen oder Entfernen von Ereignishandlern im Kontext desselben Nicht-UI-Threads ausgeführt werden.IUIAutomation :: RemoveAllEventHandlers hängt

Anmerkung: Ich bin dieses Verhalten auf Windows 7 und Windows zu sehen 8.

Alle Ideen, warum dies geschieht oder wie man es beheben? Was unterscheidet die Struktur von anderen Ereignissen?

Antwort

3

Fenster öffnen/schließen Ereignisse werden über die WinEvent-Handler des Kernels implementiert; Die Strukturänderungsereignisse betreffen die Client-App. Spult Ihr Nicht-Ui-Thread Nachrichten? Die Benutzeroberflächenautomatisierung muss Nachrichten pumpen, damit die prozessübergreifende Kommunikation funktioniert.

+1

Können Sie etwas mehr über die Notwendigkeit erklären, Nachrichten zu pumpen? Sprechen Sie über Windows-Nachrichten? Wie sollte man das machen und sind nicht alle UiAutomation Calls und Events grundsätzlich prozessübergreifend? –

+1

@o_weisman Insbesondere Singlethread-Apartment-Threads (STA-Threads) müssen Windows-Nachrichten pumpen, um eingehende COM-Aufrufe in den Thread zu senden. Wenn Sie Ihren Thread in den MTA eingefügt haben (oder verwalteter Code verwenden, der mehr oder weniger derselbe ist), können eingehende COM-Aufrufe an jeden wartenden Thread im MTA gesendet werden. Und ja, die meisten Aufrufe und Ereignisse der Benutzeroberflächenautomatisierung sind grundsätzlich prozessübergreifend. –

+1

Hallo Eric, danke für die Antwort. Im Gegensatz zum OP entwickle ich mit den verwalteten C# -Bibliotheken der Benutzeroberflächenautomatisierung, und dennoch erlebe ich in RemoveAllEventHandlers manchmal ähnliche Hänge. Was noch seltsamer ist, ich sehe sehr lange Verzögerungen (in Minuten) zwischen dem Öffnen von Winforms-Fenstern in der getesteten Anwendung und dem Aufruf meines Fensterhandlungs-Assistenten für die Benutzeroberfläche-Automation. Stoßen Sie jemals auf solche Verhaltensweisen? –