2010-07-02 21 views
5

Aşağıdaki örnek kodu test ediyordum ve bir şekilde çalıştırmayı denediğimde, aşağıda gösterilen bir hatam olacak. Ancak, calc.exe işlemi başarılı bir şekilde yürütüldü, bu yüzden sapın null veya sıfır olması nasıl mümkün olabilir? Umarım neyi aşmaya çalıştığımı anlarsınız. Teşekkürler! örnek kod http://www.mathpirate.net/log/tag/system-windows-automation/Windows UI Otomasyon

alınan tip 'System.ArgumentException' bir işlenmeyen istisna UIAutomationClient.dll ek bilgileri oluştu: HWND IntPtr.Zero veya null olamaz.

//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); 
} 

cevap

2

Sen (yani fonksiyon şu anda ne yaptığını bir horrendously kötü addır hangisi) WaitForInputIdle yanlış anlıyorsun. Ana pencerenin adresi oluşturulmadan önce ana pencerenin adresini soruyorsunuz. Sonuç olarak, geçersiz bir pencere tanıtıcısını diğer işlevlerinize aktarırsınız.

DÜZENLEME: Eğer ciddi bir iş yapıyorsanız, white gibi bir UI Otomasyon kitaplığı kullanmanızı şiddetle öneriyorum.

+0

Beyaz kullanıyorsanız, bunun birkaç sorunu olduğunu unutmayın; Mevcut projemde bunları oldukça anlamlı buldum. Beyaz konuların listesini şu adresten görebilirsiniz: http://white.codeplex.com/workitem/list/basic –

+0

Btw, UI Otomasyonunu izleme amacıyla kullanmak için önerilen bir fikir mi? Değerlerimi izlemek istediğim ve değerleri temel alan bir 3. parti uygulamasına sahibim: Bazı eylemler gerçekleştirmek istiyorum, örneğin UI eylemleri, bir düğmeyi tıklatma, metin alanı değerlerini değiştirme vb. İzleme değerlerine gelince, Her kontrolü tek tek izlemek zorunda mıyım? Teşekkürler! – user303907

İlgili konular