我会尝试简化我遇到的问题。首先,我想在 C# 中执行此操作,但我完全可以接受任何解决方案。
有一个控制台应用程序在一台机器上的 CMD 窗口中运行,它每隔一段时间就会吐出一行新的文本。这个应用程序非常不稳定,有时会死机,但窗口仍然有响应,所以 Windows 不知道。
我希望能够读取此屏幕的内容,以便在某个阈值内没有更新时我可以重新启动该过程。我可以毫无问题地执行逻辑,但是如何判断屏幕是否有任何新数据?
我正在考虑对窗口进行屏幕截图并将 A 与 B 进行比较。我知道如何进行屏幕截图,但我一直在寻找更优雅且老实说的东西,而不是像截屏那样占用大量资源的东西shot(此应用程序运行时系统负担过重)。
应用程序是通过 .bat 脚本启动的,这就是它位于 CMD 窗口中的原因(尽管显然进程本身是可访问的)。
感谢您的帮助和想法。
最佳答案
接收控制台输出的另一种方法是附加到 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 复制 如果您需要模式详细信息,请告诉我
关于c# - 已经运行的读取命令 (CMD) 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21620352/