我正在尝试从外部应用程序中抓取一个类似ListView的控件。现在我使用System.Windows.Automation
。使用AutoIt v3,我提取了以下关于要从中抓取文本的确切控件的信息:
>>>> Control <<<<
Class: WindowsForms10.Window.8.app.0.34f5582_r6_ad1
Instance: 20
ClassnameNN: WindowsForms10.Window.8.app.0.34f5582_r6_ad120
Name:
Advanced (Class): [CLASS:WindowsForms10.Window.8.app.0.34f5582_r6_ad1; INSTANCE:20]
ID: 1510520
Text:
Position: 182, 164
Size: 1411, 639
ControlClick Coords: 300, 202
Style: 0x56010000
ExStyle: 0x00000000
Handle: 0x0000000000170C78
现在,我已经注意到ID = 1510520
,通过使用它,我将能够获得控制
AutomationElement element = AutomationElement.FromHandle(1510520);
该控件看起来像一个ListView或类似的,但我不能用它做任何其他事情。
现在如何获取此控件的内容?
更新:
感谢Jimi的推荐,Windows 10 SDK中的inspect.exe运行得最好!我能够深入到DataGridView。
1条答案
按热度按时间cvxl0en21#
我假设您可以找到包含要从中提取数据的DataGridView的Window,
GeDataGridViewDataTable()
方法需要该Window的Handle。让我们分解这些方法:
要在已知句柄的情况下获取感兴趣的窗口的AutomationElement,我们可以只使用
window =
AutomationElement.FromHandle([Window Handle])
。▶这里我使用AndCodition,因为你可能有ProcessID和Window Title,所以你可以使用
AutomationElement.ProcessIdProperty
和AutomationElement.NameProperty
作为条件,而不是使用AutomationElement.ControlTypeProperty
和AutomationElement.NativeWindowHandleProperty
进行过滤。如果找到Window,则解析**
TreeScope.SubTree
**作用域中的第一个子元素(该Window中的所有UI元素),以找到Table(ControlType.Table)类型的第一个元素。▶当然,Windows可能托管多个DataGridView:在这种情况下,我们可以使用
FindAll()
代替FindFirst()
,然后使用一些其他条件(列的数量、标题的文本、单元格的内容、位置、大小、父容器等)来确定哪个是哪个。当找到感兴趣的DataGridView时,我们可以提取其Cells的内容。
下面是第二种方法
GetDataGridViewRowsCollection()
:Top Row
**。然后,我们可以使用标题文本来命名DataTable的列,该列将存储提取的数据。否则,只需添加一些默认名称。ControlType.Header
**(如果有的话)。param
数组参数**DataTable.Rows.Add()
**。