【问题标题】:Read Command (CMD) Window That Is Already Running读取已经运行的命令 (CMD) 窗口
【发布时间】:2014-02-07 05:56:59
【问题描述】:

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

在一台机器上的 CMD 窗口中运行一个控制台应用程序,它每隔一段时间就会输出一行新的文本。这个应用程序非常不稳定,有时会死机,但窗口仍然响应,所以 Windows 不知道。

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

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

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

感谢您的任何帮助和想法。

【问题讨论】:

    标签: c# console cmd screen-scraping


    【解决方案1】:

    接收控制台输出的另一种方法是附加到 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 复制 如果您需要模式详细信息,请告诉我

    【讨论】:

      【解决方案2】:

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

          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);
          }
      

      【讨论】:

        猜你喜欢
        • 2013-08-09
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多