2011-08-30 23 views
5

Tôi có một điều khiển TreeView trên biểu mẫu của mình và tôi đệ quy đi qua các phần tử của cửa sổ khác bắt đầu bằng chính cửa sổ. Tôi đang sử dụng tính năng này để tìm các yếu tố:Windows UI Automation không hiển thị tất cả các phần tử con?

getRecursiveElements(AutomationElement parent) 
{ 
    children = parent.FindAll(TreeScope.Children, Condition.TrueCondition); 

    foreach (AutomationElement child in children) 
    { 
    addToTreeView(child); 
    getRecursiveElements(child); 
    } 
} 

Nói chung, mã hoạt động khá tốt trong hầu hết các trường hợp. Cây có dân cư và tôi có một chút mã hỗ trợ khác cho phép tôi nhấp đúp chuột, ví dụ, một phần tử trong chế độ xem dạng cây và nó sẽ làm nổi bật phần tử đó trên biểu mẫu đích.

Vấn đề tôi gặp phải là, trong khi nó tạo ra một cây tuyệt vời, vẫn còn một số yếu tố bị thiếu đối với một số chương trình mục tiêu nhất định.

Lý do có thể có cho điều này là gì và có cách nào để vượt qua nó không? Nếu tôi gọi EnumChildWindows() từ user32.dll sẽ có cùng một vấn đề?

+2

Bạn có thể đưa ra một số ví dụ về các loại yếu tố mà nó bỏ qua không? Và bạn đã so sánh cây của mình với cây được sản xuất bởi công cụ UISpy hoặc Inspect từ SDK chưa? UIA không có khái niệm 'lượt xem', là bộ lọc được áp dụng ngoài điều kiện bạn cung cấp cho Tìm. Theo mặc định, UIA lọc ra những thứ không phải là phần tử nội dung, vì vậy nếu bạn liệt kê một hộp danh sách hoặc listview, bạn sẽ chỉ nhận được hộp danh sách, chứ không phải thanh cuộn hoặc tiêu đề. Đây có phải là thứ mà bạn đang thiếu, hay cái gì khác? – BrendanMcK

Trả lời

3

Không phải tất cả các chương trình đều sử dụng các điều khiển cửa sổ riêng biệt cho tất cả trẻ em hợp lý của chúng. Chủ yếu điều này phụ thuộc vào khung công tác GUI được sử dụng.

Như một ví dụ cực đoan, Qt sử dụng một cửa sổ duy nhất cho mỗi cửa sổ cấp cao nhất. Sau đó nó vẽ tất cả các widget trên biểu mẫu từ trình xử lý tin nhắn WM_PAINT của biểu mẫu.

Các chương trình thực hiện phương pháp này thường không thể tự động hóa thông qua các phương pháp chung. Có vẻ như bạn đã gặp phải một ứng dụng sử dụng một số điều khiển cửa sổ nhưng cũng sử dụng các điều khiển tùy chỉnh với một cửa sổ duy nhất cho những gì dường như là nhiều tiện ích. Một lần nữa điều này khá phổ biến.

+1

Để OP: Tôi vẫn muốn một ví dụ về nơi này là không: các ứng dụng không sử dụng HWNDs có nghĩa vụ phải thực hiện hoặc MSAA hoặc UIAutomation để họ sẽ có thể truy cập bởi người dùng khuyết tật - và cũng kết thúc được testable/automatable. Ví dụ, WPF, Silverlight và Flash và các vùng tài liệu của IE và Firefox không sử dụng HWND cho các phần tử con của chúng, nhưng vì chúng thực hiện các giao diện này, bạn vẫn có thể liệt kê chúng với UIA. Tôi tự hỏi 'các chương trình mục tiêu nhất định' là gì, vì chúng cũng có thể có các vấn đề về khả năng truy cập; Tôi tò mò nếu đây là những ứng dụng nổi tiếng. – BrendanMcK

+2

(FWIW, QT dường như thực hiện MSAA - vì vậy mặc dù nó chỉ sử dụng một HWND duy nhất, nó vẫn phải được đếm bằng UIA - vì UIA sử dụng MSAA như một nguồn thông tin trong nội bộ. cho dù nó sử dụng HWND cho các phần tử con, nó cũng có thể phụ thuộc vào việc khuôn khổ có hỗ trợ trợ năng hay không, và nếu nó có, cho dù nhà phát triển ứng dụng đã sử dụng chính xác nó chưa.) – BrendanMcK

0

Bạn có thể đưa ra ví dụ tốt hơn về những gì không thành công không? Suy nghĩ về vấn đề này, có thể là 'phần tử' ở dạng khác đang được vẽ theo cách thủ công, và do đó không có các tay cầm đăng ký riêng biệt cho mọi thứ.

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