2015-09-18 2 views
1

Я ищу способы улучшить работу поиска текста на сфокусированном AutomationElement (точка). У меня уже есть такой код. Он использует UIAComWrapper и довольно медленно.Как получить текстовое значение из точки с помощью Microsoft UI Automation?

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

ответ

1

Найдено решение. 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; 
} 
2

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

«C: \ Program Files (x86) \ Microsoft SDK \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Инструменты \ x64 \ tlbimp .exe "c: \ windows \ system32 \ uiautomationcore.dll /out:Interop.UIAutomationCore.dll

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

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

Было бы интересно сравнить производительность этого кода, работающего над интересующим вас элементом, относительно управляемого .NET API UIA и использования 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... 
} 
Смежные вопросы