2015-09-05 52 views
1

我有一個程序不是我寫的(封閉源代碼),我需要從看起來像多行文本編輯的文本中讀取文本。UI自動化查找所有(TreeScope.Descendants)沒有達到孫子

該程序在最高級別有15個選項卡的TabControl。在第15個標籤中,有我需要的文本編輯。

AutomationElement aeEntireApplication = AutomationElement.FromHandle(hwd); 
AutomationElementCollection aeEditCollection = aeEntireApplication.FindAll(TreeScope.Descendants, new PropertyCondition(AutomationElement.ClassNameProperty,"Edit")); 
foreach (AutomationElement aeEdit in aeEditCollection) 
{ 
    object patternObj; 
    if (edit.TryGetCurrentPattern(TextPattern.Pattern, out patternObj)) 
    { 
      var textPattern = (TextPattern)patternObj; 
      Console.WriteLine(textPattern.DocumentRange.GetText(-1).TrimEnd('\r')); // often there is an extra '\r' hanging off the end. 
    } 
} 

有了這個代碼,它只是將打印文本編輯的內容,以我目前的標籤。是否可以在不必打開該選項卡的情況下訪問選項卡#15的內容?

+0

AutomationElement可用於僅可見元素。很明顯,您需要使用Win32 API來處理隱藏的控件或用於本地應用程序的一些UI自動化工具(如pywinauto或AutoIt)。 –

回答

0

一個解決方案,它的工作原理使用

internal static extern bool EnumChildWindows(IntPtr hwnd, WindowEnumProc func, IntPtr lParam); 

我在整個節目的所有兒童枚舉,然後找到旁邊具有唯一名稱的編輯按鈕。然後我用

uint GW_HWNDPREV = 3; 
logTextBoxHandle = GetWindow(hwnd, GW_HWNDPREV); 

這使我得到我需要的文本編輯的句柄。

不優雅,但它似乎工作。

0

在您的用戶界面上指定Inspect SDK工具並檢查通過UIA Raw視圖顯示的內容總是值得的。原始視圖包含通過UIA爲UI顯示的所有內容。 (在Inspect中顯示的視圖可以從Inspect的選項菜單中選擇。)如果Inspect沒有向您顯示您感興趣的UI,那麼該UI不會被應用程序公開(或UI框架應用程序使用),並且您自己的UIA客戶端代碼也無法訪問它。

我剛剛用TabControl創建了一個測試WinForm應用程序。 TabControl有兩個選項卡,每個選項卡都有一個TextBox。 Inspect告訴我,在任何時候,只有活動標籤頁中包含的UI通過UIA暴露。因此,您將無法使用UIA訪問其他選項卡上的用戶界面。

謝謝,

蓋伊

enter image description here

+0

謝謝蓋伊。在決定是使用UIA還是winapi時,我會牢記這一點! –

相關問題