我正在尝试按照浏览器标签栏中列出的顺序获取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循环中,标题与浏览器中的标题顺序不同。有没有办法让它们按正确的顺序排列?
答案 0 :(得分: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
的引用并在代码中引用它:< / p>
using System.Windows;
答案 1 :(得分:0)
您可以使用Microsoft Active Accessibility(MSAA)获取正确的选项卡顺序。此方法不依赖于屏幕坐标,就像其他答案一样。以下是您需要做的事情:
Chrome_WidgetWin_1
和标题“New Tab - Google Chrome
”page tab list
”有一个很好的article可以帮助您开始使用MSAA