2014-02-07 33 views
1

我會盡量簡化我遇到的問題。首先,我想這樣做是C#,但對任何解決方案我都會很好。已經運行的讀命令(CMD)窗口

有一個控制檯應用程序運行在機器上的CMD窗口中,每隔一段時間就會吐出一行新文本。這個應用程序非常不穩定,有時會凍結,但窗口仍然響應,所以Windows不知道。

我希望能夠讀取此屏幕的內容,以便我可以在某個閾值內沒有更新時重新啓動該過程。我可以做邏輯沒有問題,但我怎麼知道屏幕是否有新的數據?

我正在考慮屏幕拍攝窗口和比較A到B.我知道如何做屏幕截圖,但我正在尋找一些更優雅的東西,說實話,這不像資源密集型屏幕截圖(在此應用程序運行時,系統相當重要)。

該應用程序通過.bat腳本啓動,這就是爲什麼它駐留在CMD窗口中(儘管顯然過程本身是可訪問的)。

謝謝你的任何幫助和想法。

回答

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 讓我知道如果你需要模式的詳細信息

+0

我認爲這將起作用。感謝:D – Skinner927

0

如果你能夠開始從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); 
    } 
+0

是的,這將工作,但我不能開始批量我:( – Skinner927