Как получить текстовое значение из Point с помощью Microsoft UI Automation?

Я ищу способы повысить производительность поиска текста на целевом элементе AutomationElement (точка). У меня уже есть такой код. Он использует UIAComWrapper и довольно медленный.

 public static string GetValueFromNativeElementFromPoint(Point p)
    {
        var element = UIAComWrapper::System.Windows.Automation.AutomationElement.FromPoint(p);
        var pattern =
            ((UIAComWrapper::System.Windows.Automation.LegacyIAccessiblePattern)
                element.GetCurrentPattern(UIAComWrapper::System.Windows.Automation.LegacyIAccessiblePattern.Pattern));
        return pattern.Current.Value;
    }

person unickq    schedule 18.09.2015    source источник


Ответы (2)


Другой вариант - попробовать использовать собственный Windows UIA API через управляемую оболочку, созданную инструментом tlbimp. В качестве теста я просто сгенерировал обертку следующим образом ...

"C: \ Program Files (x86) \ Microsoft SDK \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ x64 \ tlbimp.exe" c: \ windows \ system32 \ uiautomationcore.dll /out:Interop.UIAutomationCore. dll

Затем я написал приведенный ниже код и сослался на оболочку в проекте C #.

Код получает элемент UIA в интересующей нас точке и запрашивает информацию о том, поддерживает ли элемент шаблон Value, и должна быть кэширована в то время, когда мы получим элемент. Это означает, что когда у нас есть элемент, мы можем узнать, поддерживает ли он шаблон Value, без необходимости делать еще один перекрестный вызов.

Было бы интересно сравнить производительность этого кода, работающего с интересующим вас элементом, по сравнению с управляемым .NET UIA API и использованием UIAComWrapper.

IUIAutomation uiAutomation = new CUIAutomation8();

int patternIdValue = 10002; // UIA_ValuePatternId
IUIAutomationCacheRequest cacheRequestValuePattern = uiAutomation.CreateCacheRequest();
cacheRequestValuePattern.AddPattern(patternIdValue);

IUIAutomationElement element = uiAutomation.ElementFromPointBuildCache(pt, cacheRequestValuePattern);

IUIAutomationValuePattern valuePattern = element.GetCachedPattern(patternIdValue);
if (valuePattern != null)
{
    // Element supports the Value pattern...
}
person Guy Barker - Microsoft    schedule 22.09.2015

Нашел решение. 2 секунды против 7 секунд с использованием UIAComWrapper.

public static string GetValueFromNativeElementFromPoint2(Point p)
{
    var element = AutomationElement.FromPoint(p);
    object patternObj;
    if (element.TryGetCurrentPattern(ValuePattern.Pattern, out patternObj))
    {
        var valuePattern = (ValuePattern) patternObj;
        return valuePattern.Current.Value;
    }            
    return null;
}
person unickq    schedule 21.09.2015