2016-02-24 63 views
4

我想按照它們在瀏覽器的選項卡欄中列出的順序獲取Chrome選項卡的列表。以正確的順序獲取Chrome選項卡

這是我的代碼:

var automationElements = AutomationElement.FromHandle(proc.MainWindowHandle); 

// Find `New Tab` element 
var propCondNewTab = new PropertyCondition(AutomationElement.NameProperty, "New Tab"); 
var elemNewTab = automationElements.FindFirst(TreeScope.Descendants, propCondNewTab); 

// Get parent of `New Tab` element 
var treeWalker = TreeWalker.ControlViewWalker; 
var elemTabStrip = treeWalker.GetParent(elemNewTab); 

// Loop through all tabs 
var tabItemCondition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.TabItem); 
foreach (AutomationElement tabItem in elemTabStrip.FindAll(TreeScope.Children, tabItemCondition)) { 
    var nameProperty = tabItem.GetCurrentPropertyValue(AutomationElement.NameProperty); 
    Debug.WriteLine("title: " + nameProperty.ToString()); 
} 

然而在foreach循環中的標題是不相同的順序,因爲它們是在瀏覽器中。有沒有辦法讓他們按正確的順序?

回答

3

我不知道直接獲取選項卡順序的方法。你可以做的是獲取選項卡矩形的位置,並通過它們在X軸上的矩形位置來排列你的選項卡。

一個非常快速的例子,我使用SortedDictionary來保存標籤及其X值。之後,循環遍歷字典中的鍵並提取選項卡項。由於字典是排序的,因此按鍵順序排列,所以列表將按照瀏覽器中顯示的順序排列。

SortedDictionary<double, AutomationElement> orderedTabItems = new SortedDictionary<double, AutomationElement>(); 

// Loop through all tabs 
var tabItemCondition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.TabItem); 
foreach (AutomationElement tabItem in elemTabStrip.FindAll(TreeScope.Children, tabItemCondition)) 
{ 
    Rect rectangleProperty = (Rect)tabItem.GetCurrentPropertyValue(AutomationElement.BoundingRectangleProperty); 
    orderedTabItems.Add(rectangleProperty.X, tabItem); 
} 

for(int i = 0; i < orderedTabItems.Keys.Count; i++) 
{ 
    var key = orderedTabItems.Keys.ElementAt(i); 
    var tabItem = orderedTabItems[key]; 
    var nameProperty = tabItem.GetCurrentPropertyValue(AutomationElement.NameProperty); 
    Debug.WriteLine("index: " + i + ", title: " + nameProperty.ToString()); 
} 

我相信一個更好的解決方案是可能的。這是我第一次嘗試使用System.Windows.Automation

編輯:我忘了提,訪問矩形的X財產,你需要添加一個引用到WindowsBase.dll和參考此代碼:

using System.Windows; 
+1

這個偉大的工程至今! – gartenriese

+0

這很好,但就像我寫的那樣,這是我第一次嘗試使用'System.Windows.Automation',所以可能有更簡單的方法來完成它。老實說,通過使用@stamhaney建議的方法,它從「頁面選項卡列表」中獲取標籤,而不是調查UI矩形位置,「感覺不錯」:-) –

0

你可以得到正確的次序使用Microsoft Active Accessibility(MSAA)的選項卡。這種方法不像其他答案那樣依賴於屏幕座標。以下是你需要做的:

  1. 獲取Chrome瀏覽器的頂部窗口訪問對象的類Chrome_WidgetWin_1和標題爲「New Tab - Google Chrome
  2. 查看該角色可訪問對象「page tab list
  3. 獲得殘疾人專用點2中找到的對象的子項
  4. 遍歷子項列表並顯示accName屬性。

這是一個很好article,它可以幫助您開始使用MSAA

+0

您能詳細說明一下嗎? D – gartenriese

+0

@gartenriese,在MSAA上添加了一些更多信息和鏈接 – stamhaney

+0

在您的鏈接中,他們通過調用'GetTopWindowAccessibleList'獲取列表中頂部窗口可訪問的對象,但是該函數從未解釋過。我如何獲得這些可訪問的對象? – gartenriese

相關問題