2010-07-02 18 views
5

Estaba probando el código de ejemplo de seguimiento y, de alguna manera, cada vez que intenté ejecutarlo, aparecerá un error a continuación. Sin embargo, el proceso calc.exe se ejecutó con éxito, entonces, ¿cómo es posible que el identificador sea nulo o cero? Espero que entiendas lo que intento transmitir. ¡Gracias! El ejemplo de código es de http://www.mathpirate.net/log/tag/system-windows-automation/Automatización de la interfaz de usuario de Windows

Una excepción no controlada del tipo 'System.ArgumentException' produjo en UIAutomationClient.dll Información adicional: hwnd no puede ser IntPtr.Zero o nulo.

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

Respuesta

2

Estás malentendido WaitForInputIdle (que es un terriblemente mal nombre para lo que hace actualmente esa función). Está pidiendo la dirección de la ventana principal incluso antes de que se haya creado una ventana principal. Como resultado, terminas pasando un identificador de ventana no válido a tus otras funciones.

EDITAR: Recomiendo encarecidamente el uso de una biblioteca de automatización de UI como white si va a hacer un trabajo serio con ella.

+0

Si usa White, tenga en cuenta que tiene algunos problemas; Los encontré bastante significativos en mi proyecto actual. Puede ver la lista de problemas de White en: http://white.codeplex.com/workitem/list/basic –

+0

Por cierto, ¿es esta una idea recomendada para usar la Automatización de UI con fines de monitoreo? Tengo una aplicación de terceros en la que los valores que quiero monitorear y en función de los valores, me gustaría realizar algunas acciones, es decir, acciones de IU, hacer clic en un botón, cambiar los campos de texto, etc. En cuanto a los valores de monitoreo, ¿Tengo que controlar individualmente cada control? Gracias! – user303907

Cuestiones relacionadas