已经运行的读命令(CMD)窗口

时间:2014-02-07 05:57:00

标签: c# console cmd screen-scraping

我会尝试简化我遇到的问题。首先,我想做的就是C#,但我对任何解决方案都很满意。

在计算机上的CMD窗口中运行一个控制台应用程序,每隔一段时间就会发出一行新文本。此应用程序非常不稳定,有时冻结,但窗口仍然响应,因此Windows不知道。

我希望能够读取此屏幕的内容,以便在某个阈值内没有更新时重新启动该过程。我可以做逻辑没问题,但是如何判断屏幕是否有任何新数据?

我正在考虑屏幕拍摄窗口并将A与B进行比较。我知道如何进行屏幕截图,但我正在寻找更优雅的东西,说实话,这不像屏幕上那样耗费资源shot(在此应用程序运行时系统非常繁琐)。

应用程序是通过.bat脚本启动的,这就是它驻留在CMD窗口中的原因(尽管显然过程本身是可访问的)。

感谢您的帮助和想法。

2 个答案:

答案 0 :(得分:0)

如果能够从C#包装器应用程序启动批处理文件,请通过C#app创建进程:

    Process proc = new Process();
    proc.StartInfo = new ProcessStartInfo("d:\\batch.bat")
    {
        RedirectStandardOutput = true,
        UseShellExecute = false
    };
    bool updated = false;
    Timer waitTimer= new Timer(state =>
    {
        if (!updated)
        {
            proc.Kill();
            return;
        }
        updated = false;

    });
    waitTimer.Change(1000, 1000);
    proc.Start();
    while (! proc.StandardOutput.EndOfStream)
    {
        var line = proc.StandardOutput.ReadLine();
        updated = true;
        Console.WriteLine(line);
    }

答案 1 :(得分:0)

接收控制台输出的另一种方法是附加到cmd进程:

var poList= Process.GetProcesses().Where(process => process.ProcessName.Contains("cmd"));
var a = poList.First();
//FreeConsole();//if you use console application you must free self console
AttachConsole((uint) a.Id);
var err=Marshal.GetLastWin32Error();
var ptr=GetStdHandle(-11);

SMALL_RECT srctReadRect= new SMALL_RECT
{
    Top = 0,Left = 0,Bottom = 1,Right = 79
};
CHAR_INFO[,] chiBuffer = new CHAR_INFO[2,80]; // [2][80]; 
COORD coordBufSize= new COORD
{
     X = 2,Y = 80
};
COORD coordBufCoord = new COORD
{
   X = 0,
   Y = 0
};
bool fSuccess; 
fSuccess = ReadConsoleOutput( ptr,chiBuffer,coordBufSize,chiBuffer coordBufCoord,ref srctReadRect);

所有pinvoke功能都可以从PInvike ConsoleFunctions复制 如果您需要模式详细信息,请告诉我