我会尝试简化我遇到的问题。首先,我想做的就是C#,但我对任何解决方案都很满意。
在计算机上的CMD窗口中运行一个控制台应用程序,每隔一段时间就会发出一行新文本。此应用程序非常不稳定,有时冻结,但窗口仍然响应,因此Windows不知道。
我希望能够读取此屏幕的内容,以便在某个阈值内没有更新时重新启动该过程。我可以做逻辑没问题,但是如何判断屏幕是否有任何新数据?
我正在考虑屏幕拍摄窗口并将A与B进行比较。我知道如何进行屏幕截图,但我正在寻找更优雅的东西,说实话,这不像屏幕上那样耗费资源shot(在此应用程序运行时系统非常繁琐)。
应用程序是通过.bat脚本启动的,这就是它驻留在CMD窗口中的原因(尽管显然过程本身是可访问的)。
感谢您的帮助和想法。
答案 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复制 如果您需要模式详细信息,请告诉我