在图像下面有一个区域,其具有一个未知的(定制)类。 这不是一个网格或表。
我需要能够:
- 在此区域内选择行
- 抓住从每一个小区的值
问题是,因为这不是一个常见的元素 - 我不知道怎么谷歌这个问题,或者解决它自己。 到目前为止,代码如下:
Process[] proc = Process.GetProcessesByName("programname");
AutomationElement window = AutomationElement.FromHandle(proc [0].MainWindowHandle);
PropertyCondition xEllist2 = new PropertyCondition(AutomationElement.ClassNameProperty, "CustomListClass", PropertyConditionFlags.IgnoreCase);
AutomationElement targetElement = window.FindFirst(TreeScope.Children, xEllist2);
我已经试图威胁这个区域作为一个文本框,一个网格,作为一个组合框,但没有解决我的问题至今。 没有任何人有任何意见如何从这个区域中获取数据,并通过行迭代?
编辑:对不起,我犯了一个错误的假设。 实际上,报头(列1,列2,列3)和该区域的“下半部”是不同的控制类型 !!
由于Wininspector我能够挖掘有关这些控制类型的详细信息:
- 报头具有以下性质:HeaderControl 0x056407DC(90441692)的Atom:#43288 0xFFFFFFFF的(-1)
- 和下半部有以下:ListControl的0x056408A4(90441892)的Atom:#43288 0x02A6FDA0(44498336)
那我之前展示的代码 - 检索“列表”元素只,所以这里是更新:
Process[] proc = Process.GetProcessesByName("programname");
AutomationElement window = AutomationElement.FromHandle(proc [0].MainWindowHandle);
//getting the header
PropertyCondition xEllist3 = new PropertyCondition(AutomationElement.ClassNameProperty, "CustomHeaderClass", PropertyConditionFlags.IgnoreCase);
AutomationElement headerEl = XElAE.FindFirst(TreeScope.Children, xEllist3);
//getting the list
PropertyCondition xEllist2 = new PropertyCondition(AutomationElement.ClassNameProperty, "CustomListClass", PropertyConditionFlags.IgnoreCase);
AutomationElement targetElement = window.FindFirst(TreeScope.Children, xEllist2);
给它一个进一步的思考之后,我一直试图让所有列名:
AutomationElementCollection headerLines = headerEl.FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.HeaderItem));
string headertest = headerLines[0].GetCurrentPropertyValue(AutomationElement.NameProperty) as string;
textBox2.AppendText("Header 1: " + headertest + Environment.NewLine);
在“headerLines”不幸的是在调试模式元素计数为0,因此该程序引发错误。
编辑2:多亏了下面的答案-我已经安装了非托管UI自动化,它拥有比默认UIA更好的机会。 http://uiacomwrapper.codeplex.com/你如何使用旧模式来抓住从未知的控制类型的数据?
if((bool)datagrid.GetCurrentPropertyValue(AutomationElementIdentifiers.IsLegacyIAccessiblePatternAvailableProperty))
{
var pattern = ((LegacyIAccessiblePattern)datagrid.GetCurrentPattern(LegacyIAccessiblePattern.Pattern));
var state = pattern.Current.State;
}
编辑3. IUIAutoamtion办法(非工作截至目前)
_automation = new CUIAutomation();
cacheRequest = _automation.CreateCacheRequest();
cacheRequest.AddPattern(UiaConstants.UIA_LegacyIAccessiblePatternId);
cacheRequest.AddProperty(UiaConstants.UIA_LegacyIAccessibleNamePropertyId);
cacheRequest.TreeFilter = _automation.ContentViewCondition;
trueCondition = _automation.CreateTrueCondition();
Process[] ps = Process.GetProcessesByName("program");
IntPtr hwnd = ps[0].MainWindowHandle;
IUIAutomationElement elementMailAppWindow = _automation.ElementFromHandle(hwnd);
List<IntPtr> ls = new List<IntPtr>();
ls = GetChildWindows(hwnd);
foreach (var child in ls)
{
IUIAutomationElement iuiae = _automation.ElementFromHandle(child);
if (iuiae.CurrentClassName == "CustomListClass")
{
var outerArayOfStuff = iuiae.FindAllBuildCache(interop.UIAutomationCore.TreeScope.TreeScope_Children, trueCondition, cacheRequest.Clone());
var outerArayOfStuff2 = iuiae.FindAll(interop.UIAutomationCore.TreeScope.TreeScope_Children, trueCondition);
var countOuter = outerArayOfStuff.Length;
var countOuter2 = outerArayOfStuff2.Length;
var uiAutomationElement = outerArayOfStuff.GetElement(0); // error
var uiAutomationElement2 = outerArayOfStuff2.GetElement(0); // error
//...
//I've erased what's followed next because the code isn't working even now..
}
}
该代码是实现得益于此问题:
阅读使用C#从另一个应用程序的数据SysListView32网格单元项目
作为结果:
- countOuter和countOuter2长度= 0
- 不可能选择元件(从列表中的行)
- 不可能得到任何价值
- 没有什么工作