C# - 读取某些应用程序的datagridview

时间:2016-09-16 11:52:05

标签: c# datagridview

我有一些应用程序,我想阅读它的datagridview,这可能吗? (这不是我的应用所以我没有它的源代码)。 例如假设我想读取windows caluculator app的文本框数据..

我听说过'自动'处理这类问题的软件,可以通过c#编程吗?

1 个答案:

答案 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应用程序的网格标题:

http://pinvoke.net/

代码:

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:

enter image description here

Getting full contents of a Datagrid using UIAutomation