Windows UI Automation - PullRequest
       4

Windows UI Automation

5 голосов
/ 02 июля 2010

Я тестировал следующий пример кода, и, как только я попробовал запустить его, у меня будет ошибка, показанная ниже.Однако процесс calc.exe был выполнен успешно, так как же возможно, что дескриптор будет нулевым или нулевым?Я надеюсь, вы понимаете, что я пытаюсь донести.Спасибо!Пример кода из http://www.mathpirate.net/log/tag/system-windows-automation/

Произошло необработанное исключение типа 'System.ArgumentException' в UIAutomationClient.dll Дополнительная информация: hwnd не может быть IntPtr.Zero или нулевым.

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

1 Ответ

2 голосов
/ 02 июля 2010

Вы неправильно понимаете WaitForInputIdle (что является УЖАСНЫМ дурным именем для того, что в данный момент делает эта функция). Вы спрашиваете адрес главного окна еще до того, как главное окно было создано. В результате вы передаете неверный дескриптор окна другим функциям.

РЕДАКТИРОВАТЬ: я настоятельно рекомендую использовать библиотеку автоматизации пользовательского интерфейса, например white, если вы собираетесь с ней серьезно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...