2011-08-30 76 views
5

我在窗體上有一個TreeView控件,我遞歸地瀏覽窗口本身開始的另一個窗口的元素。我正在使用它來查找元素:Windows用戶界面自動化不顯示所有子元素?

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

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

一般而言,代碼在大多數情況下工作得很好。樹被填充,我有一些其他支持代碼允許我雙擊,例如樹視圖中的一個元素,它會突出顯示目標表單上的元素。

我遇到的問題是,雖然它生成了一個很棒的樹,但仍有一些元素缺少某些目標程序。

這有什麼可能的原因,有什麼辦法可以解決嗎? 如果我從user32.dll中調用EnumChildWindows()會有同樣的問題嗎?

+2

你可以舉一些它正在跳過的元素類型的例子嗎?您是否將您的樹與SDK中的UISpy或Inspect工具生成的樹相比較? UIA確實有一個'views'的概念,它是一個除了提供給Find的條件外還應用的過濾器。默認情況下,UIA會過濾掉不是內容元素的東西,因此如果枚舉列表框或列表視圖,則只會顯示列表框,但不會顯示滾動條或標題。這是你錯過的東西,還是其他的東西? – BrendanMcK

回答

3

並非所有程序都爲其所有邏輯子項使用單獨的窗口控件。大多數情況下,這取決於所使用的GUI框架。

作爲一個極端的例子,Qt爲每個頂級窗口使用一個窗口。然後它從窗體的WM_PAINT消息處理程序中繪製窗體上的所有窗口小部件。

採用此方法的程序通常不可能通過泛型方法自動化。

聽起來好像你遇到了一個應用程序,它使用了一些窗口控件,但也使用了單個窗口的自定義控件來顯示多個窗口小部件。這又是很常見的。

+1

對於OP:我仍然想要一個失敗的例子:不使用HWND的應用程序應該實現MSAA或UIAutomation,以便殘障用戶可以訪問它們 - 並且最終可以測試/自動化。例如,WPF,Silverlight和Flash以及IE和Firefox的文檔區域不使用HWND作爲它們的子元素,但是由於它們實現了這些接口,所以仍然可以使用UIA枚舉它們。我想知道「某些目標計劃」是什麼,因爲他們可能還有無障礙問題;我很好奇,如果這些是知名的應用程序。 – BrendanMcK

+2

(FWIW,QT顯然實現了MSAA - 即使它只使用一個HWND,它仍然可以使用UIA進行枚舉 - 因爲UIA在內部使用MSAA作爲信息源。無論UI是否可與UIA一起枚舉都比簡單是否使用HWNDs作爲子元素;它還取決於該框架是否具有可訪問性支持,以及是否具有該應用程序的開發人員是否已正確使用它。) – BrendanMcK

0

你能舉出一個更好的例子嗎?考慮到這個問題,可能是因爲其他表單中的'元素'是手動繪製的,因此沒有明確的註冊處理。

相關問題