2010-07-02 7 views
5

Ich habe den folgenden Beispielcode getestet und irgendwie, wann immer ich es versucht habe, werde ich einen Fehler unten gezeigt haben. Der Prozess calc.exe wurde jedoch erfolgreich ausgeführt. Wie ist es möglich, dass der Handle null oder null ist? Ich hoffe, Sie verstehen, was ich vermitteln möchte. Vielen Dank! Das Codebeispiel aus ist http://www.mathpirate.net/log/tag/system-windows-automation/Windows-Benutzeroberfläche Automatisierung

Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException' aufgetreten in UIAutomationClient.dll Zusätzliche Informationen: Hwnd nicht IntPtr.Zero oder null sein kann.

//Launches the Windows Calculator and gets the Main Window's Handle. 
Process calculatorProcess = Process.Start("calc.exe"); 
calculatorProcess.WaitForInputIdle(); 
IntPtr calculatorWindowHandle = calculatorProcess.MainWindowHandle; 

//Here I use a window handle to get an AutomationElement for a specific window. 
AutomationElement calculatorElement = AutomationElement.FromHandle(calculatorWindowHandle); 

if(calculatorElement == null) 
{ 
    throw new Exception("Uh-oh, couldn't find the calculator..."); 
} 

//Walks some of the more interesting properties on the AutomationElement. 
Console.WriteLine("--------Element"); 
Console.WriteLine("AutomationId: {0}", calculatorElement.Current.AutomationId); 
Console.WriteLine("Name: {0}", calculatorElement.Current.Name); 
Console.WriteLine("ClassName: {0}", calculatorElement.Current.ClassName); 
Console.WriteLine("ControlType: {0}", calculatorElement.Current.ControlType.ProgrammaticName); 
Console.WriteLine("IsEnabled: {0}", calculatorElement.Current.IsEnabled); 
Console.WriteLine("IsOffscreen: {0}", calculatorElement.Current.IsOffscreen); 
Console.WriteLine("ProcessId: {0}", calculatorElement.Current.ProcessId); 

//Commented out because it requires another library reference. However, it's useful to see that this exists. 
//Console.WriteLine("BoundingRectangle: {0}", calculatorElement.Current.BoundingRectangle); 

Console.WriteLine("Supported Patterns:"); 
foreach (AutomationPattern supportedPattern in calculatorElement.GetSupportedPatterns()) 
{ 
    Console.WriteLine("\t{0}", supportedPattern.ProgrammaticName); 
} 

Antwort

2

Sie sind Missverständnisse WaitForInputIdle (das ist ein horrend schlecht Name ist für das, was diese Funktion zur Zeit der Fall ist). Sie fragen nach der Adresse des Hauptfensters, bevor ein Hauptfenster erstellt wurde. Als Ergebnis übergeben Sie ein ungültiges Fensterhandle an Ihre anderen Funktionen.

EDIT: Ich würde dringend die Verwendung einer UI Automation Bibliothek wie white empfehlen, wenn Sie ernsthafte Arbeit damit tun werden.

+0

Wenn Sie Weiß verwenden, beachten Sie, dass es einige Probleme gibt. Ich fand diese für mein aktuelles Projekt ziemlich wichtig. Die Liste der White-Probleme finden Sie unter: http://white.codeplex.com/workitem/list/basic –

+0

Btw, ist dies eine empfohlene Idee, die UI-Automatisierung für Überwachungszwecke zu verwenden? Ich habe eine Anwendung von Drittanbietern, in dem die Werte, die ich überwachen möchte und basierend auf den Werten, möchte ich einige Aktionen ausführen, dh UI-Aktionen, Klicken auf eine Schaltfläche, Ändern von Textfeldwerten etc. Muss ich jede Steuerung einzeln überwachen? Danke! – user303907