我有一些应用程序,我想阅读它的datagridview,这可能吗? (这不是我的应用所以我没有它的源代码)。 例如假设我想读取windows caluculator app的文本框数据..
我听说过'自动'处理这类问题的软件,可以通过c#编程吗?
答案 0 :(得分:0)
AutoIt可以使用c#,libs可以在这里找到:
Mapped Diagnostics Context layout renderer
例如,要获取calc应用程序的值,您可以执行此操作:
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName,
string lpWindowName);
IntPtr handle = FindWindow("CalcFrame", "Calculator");
如果您不想使用autoit,可以使用PInvoke。
您可以使用Pinvoke获取calc窗口的句柄,如下所示:
System.Windows.Automation;
等...
要查看更复杂的示例,您可以在此处阅读我的答案,以获取Internet Explorer中的标签。
https://www.autoitscript.com/site/autoit/downloads/
有关Pinvoke的更多信息:
https://stackoverflow.com/a/37595421/5703316
修改强>
经过一番思考后,我认为最好的方法是使用 static void Main(string[] args)
{
int id = System.Diagnostics.Process.GetProcessesByName("WindowsFormsApplication1")[0].Id;
AutomationElement desktop = AutomationElement.RootElement;
AutomationElement bw = desktop.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ProcessIdProperty, id));
AutomationElement datagrid = bw.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.AutomationIdProperty, "dataGridView1"));
AutomationElementCollection headers = datagrid.FindAll(TreeScope.Descendants, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Header));
var headerCol1 = headers[1].Current.Name; ;
var headerCol2 = headers[2].Current.Name;
Console.WriteLine(headerCol1 + " " + headerCol2);
}
我做了一个小例子向您展示如何使用自动化框架。
这是一个控制台应用程序,可以获取这个小型windowsForm应用程序的网格标题:
代码:
function getPosition(el) {
var xPos = 0;
var yPos = 0;
while (el) {
if (el.tagName == "BODY") {
// deal with browser quirks with body/window/document and page scroll
var xScroll = el.scrollLeft || document.documentElement.scrollLeft;
var yScroll = el.scrollTop || document.documentElement.scrollTop;
xPos += (el.offsetLeft - xScroll + el.clientLeft);
yPos += (el.offsetTop - yScroll + el.clientTop);
} else {
// for all other non-BODY elements
xPos += (el.offsetLeft - el.scrollLeft + el.clientLeft);
yPos += (el.offsetTop - el.scrollTop + el.clientTop);
}
el = el.offsetParent;
}
return {
x: xPos,
y: yPos
};
}
您可以在SO上找到许多Q / A来使用UI Automation操作DataGridView: