【问题标题】:Screen scraping a console window from .Net从 .Net 抓取控制台窗口的屏幕
【发布时间】:2015-05-30 00:18:12
【问题描述】:

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

有没有办法使用 UI 自动化或类似方法来写入已经运行的控制台窗口(并从它的特定部分读取)?最好在 C# 中。

这样我可以远程控制系统,并遍历其中的数据,将其转储出去。

【问题讨论】:

  • 该方法不允许我获取屏幕上位置 X=5,Y=10 的内容(例如)。这是一个 DOS 用户界面,所以我需要检查给定位置的内容。
  • 您必须进入非常低的级别并检索与应用程序控制台关联的数组。找不到好的例子。首先阅读 MSDN 文档中的 GetConsoleScreenBufferInfo API。
  • 我的回答有帮助吗:stackoverflow.com/questions/12355378/…
  • 至于写好的旧sendkeys怎么样?写入 consol 缓冲区似乎不是“控制”程序的一种方式。 - 至于阅读,如果一切都失败了,你可以刮掉屏幕并将像素转换为它们的字符。这会有多大的痛苦,取决于你有多少控制权以及程序的行为有多怪异,比如改变字体和颜色..

标签: c# windows ui-automation


【解决方案1】:

应该这样做:

    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,找到系统按钮(左上角的小部件,它有一个系统功能的下拉菜单),然后选择“编辑->全选”。然后它再次执行此操作,仅使用“编辑->复制”。

最后三分之一获取此文本并将其拆分为屏幕宽度的块(在我的情况下为 150 个字符)。

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

        var window = AutomationElement.FromHandle(hWnd);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-06
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多