屏幕从.Net抓取控制台窗口

时间:2015-05-28 15:46:10

标签: c# windows ui-automation

我有一个古老的基于DOS的命令行系统,我需要从中提取大量数据,并且无法直接访问数据。

是否有一种方法可以使用UI Automation或类似方法写入已经运行的控制台窗口(并从中读取特定部分)?最好是在C#中。

这样我就可以远程控制系统,并迭代其中的数据,将其丢弃。

1 个答案:

答案 0 :(得分:0)

这应该这样做:

    public static IEnumerable<string> GetScreenContents(AutomationElement window)
    {
        var systemButton = window.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, "System"));
        var pattern = (ExpandCollapsePattern)systemButton.GetCurrentPattern(ExpandCollapsePattern.Pattern);
        pattern.Expand();
        SendKeys.SendWait("E");
        SendKeys.SendWait("S");
        Thread.Sleep(100);
        pattern.Expand();
        SendKeys.SendWait("E");
        SendKeys.SendWait("Y");
        Thread.Sleep(100);
        var clipText = Clipboard.GetText();

        var screenWidth = 150;

        return Enumerable.Range(0, clipText.Length / screenWidth)
            .Select(i => clipText.Substring(i * screenWidth, screenWidth));
    }

它的第一个2/3转到给定的AutomationElement,找到系统按钮(左上方的小部件,其中包含系统功能的下拉菜单),然后选择“Edit-&gt; Select All”。然后它再次执行此操作,仅使用“编辑 - >复制”。

最后的第三个文本将此文本拆分为屏幕宽度(在我的情况下为150个字符)。

您可以使用以下命令从给定的hWnd获取AutomationElement:

        var window = AutomationElement.FromHandle(hWnd);