2014-05-24 37 views
5

Tôi đang cố gắng lấy văn bản/nhãn từ các điều khiển ứng dụng với Tự động hóa trong C#.C# System.Windows.Automation lấy văn bản phần tử

Cho đến nay tôi có thể có được AutomationElement cây của ứng dụng (ví dụ như Notepad) với chức năng này:

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

Tôi cố gắng để làm theo bài viết này http://msdn.microsoft.com/en-us/library/ms788751(v=vs.110).aspx nhưng nó chỉ có thể nhận được văn bản thuộc tính tên như phông chữ, phông chữ trọng lượng và như vậy.

Có ai có thể chỉ cho tôi quy trình đúng cách lấy văn bản phần tử với Tự động hóa không?

Trả lời

8

Mẫu đó cho bạn thấy cách nhận được thuộc tính văn bản, tức là thông tin về hiển thị văn bản trong giao diện người dùng chứ không phải văn bản được hiển thị thực tế. Bắt tất cả các văn bản hiển thị thực tế cho một ứng dụng chung là khó khăn hơn mà nó có thể lần đầu tiên xuất hiện.

Thực hiện rất khó bởi thực tế là có một số cách nhận văn bản và có sự hỗ trợ không nhất quán giữa các ứng dụng và điều khiển. Có hai mẫu được sử dụng một số, ValuePatternTextPattern. Theo quy ước, thuộc tính Name chứa văn bản được hiển thị cho người dùng tuy nhiên việc tuân thủ điều này là không phù hợp. Dưới đây là một phương pháp trợ giúp mà tôi đã sử dụng trong tự động hóa giao diện người dùng để kiểm tra. Về cơ bản nó đi qua các mẫu kiểm tra sự kiểm soát hỗ trợ và rơi trở lại Tên.

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

Điều này sẽ giúp bạn thoát khỏi các điều khiển đơn giản như nhãn, hộp văn bản (cả hộp văn bản vani và richtextbox) và các nút. Các điều khiển như hộp danh sách và combobox (đặc biệt trong WPF) có thể phức tạp hơn vì các mục của chúng có thể được ảo hóa để chúng có thể không tồn tại trong cây tự động hóa cho đến khi người dùng tương tác với chúng. Bạn có thể muốn lọc và gọi phương thức này chỉ trên một số loại điều khiển Tự động hóa Giao diện người dùng nhất định như Chỉnh sửa, Văn bản và Tài liệu mà bạn biết có chứa văn bản.

+0

Cảm ơn nó hoạt động. Chỉ cần trên dòng thứ 3 bạn có lỗi trong các từ khóa "tĩnh" kép tôi giả định thứ hai nên là "chuỗi". Trên dòng thứ 6 bạn đang thiếu dấu đóng ngoặc ở cuối dòng. – Cockootec

+0

điều khiển spinner –

Các vấn đề liên quan