2014-05-24 6 views
5

Ich versuche, Text/Etiketten von Anwendungssteuerelementen mit Automatisierung in C# zu erhalten.C# System.Windows.Automation get element text

So weit ich bin in der Lage Automation Baum der Anwendung (zB Notepad) mit dieser Funktion zu erhalten:

private void WalkControlElements(AutomationElement rootElement, TreeNode treeNode) 
    { 
     AutomationElement elementNode = TreeWalker.ContentViewWalker.GetFirstChild(rootElement);; 

     while (elementNode != null) 
     { 
      TreeNode childTreeNode = treeNode.Nodes.Add(elementNode.Current.ControlType.LocalizedControlType); 

      // here I want to get text from 'elementNode' 

      WalkControlElements(elementNode, childTreeNode); 
      elementNode = TreeWalker.ControlViewWalker.GetNextSibling(elementNode); 
     } 
    } 

Ich habe versucht, um diesen Artikel zu folgen http://msdn.microsoft.com/en-us/library/ms788751(v=vs.110).aspx aber es kann nur erhalten Textattribute wie Schriftart, Schrift Gewicht und so weiter.

Könnte mich jemand auf die richtige Prozedur verweisen, wie man Element-Text mit Automation bekommt?

Antwort

8

Dieses Beispiel zeigt Ihnen, wie Sie Textattribute, d. H. Informationen über die Anzeige des Textes in der Benutzeroberfläche, nicht den tatsächlichen angezeigten Text erhalten. Es ist schwieriger, den tatsächlich angezeigten Text für eine allgemeine Anwendung zu erhalten.

Es wird durch die Tatsache erschwert, dass es mehrere Möglichkeiten gibt, Text zu bekommen, und es gibt inkonsistente Unterstützung durch Anwendungen und Kontrollen. Es gibt zwei Muster, die von Nutzen sind, ValuePattern und TextPattern. Gemäß der Konvention enthält die Eigenschaft Name Text, der dem Benutzer angezeigt wird, die Einhaltung ist jedoch inkonsistent. Im Folgenden finden Sie eine Hilfsmethode, die ich zum Testen in der Benutzeroberflächenautomatisierung verwendet habe. Es durchläuft grundsätzlich diese Muster, überprüft das Steuerelement auf Unterstützung und fällt auf den Namen zurück.

public static class AutomationExtensions 
{ 
    public static string GetText(this AutomationElement element) 
    { 
     object patternObj; 
     if (element.TryGetCurrentPattern(ValuePattern.Pattern, out patternObj)) 
     { 
      var valuePattern = (ValuePattern)patternObj; 
      return valuePattern.Current.Value; 
     } 
     else if (element.TryGetCurrentPattern(TextPattern.Pattern, out patternObj)) 
     { 
      var textPattern = (TextPattern)patternObj; 
      return textPattern.DocumentRange.GetText(-1).TrimEnd('\r'); // often there is an extra '\r' hanging off the end. 
     } 
     else 
     { 
      return element.Current.Name; 
     } 
    } 
} 

Diese kümmert sich um den Text aus einfachen Kontrollen wie Etiketten bekommen, Textfelder (beide Vanille Textbox und richtextbox) und Schaltflächen. Steuerelemente wie Listboxen und Comboboxen (vor allem in WPF) können trickreich sein, da ihre Elemente virtualisiert werden können, so dass sie möglicherweise nicht in der Automatisierungsstruktur existieren, bis der Benutzer mit ihnen interagiert. Möglicherweise möchten Sie diese Methode nur für bestimmte UI-Automatisierungsteuertypen wie "Bearbeiten", "Text" und "Dokument", von denen Sie wissen, dass sie Text enthalten, filtern und aufrufen.

+0

Danke, es funktioniert. Gerade in der dritten Zeile haben Sie Fehler in doppelten "statischen" Schlüsselwörtern Ich nehme an, dass die zweite "Zeichenfolge" sein sollte. In der 6. Zeile fehlt die schließende Klammer am Zeilenende. – Cockootec

+0

Spinner Kontrolle –