c# - 已经运行的读取命令 (CMD) 窗口

标签 c# console cmd screen-scraping

我会尝试简化我遇到的问题。首先,我想在 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/

相关文章:

c# - 我需要在页面加载后发帖,但我使用的是 Thread

python - 在 Python 中添加交互性?

linux - 使用单个命令刷新特定的 Redis 数据库

cmd - 成功编译 .chm 文件后 HTML Help Workshop 返回错误

windows - 从 Windows 命令行请求新的 Tor 身份

C# 检测按键,避免非键入键

c# - 如何将带有子查询的 SQL 查询转换为 .NET Core 查询

MySql 错误 ERROR 2003 (HY000) : Can't connect to MySQL server on 'localhost' (10061)

c# - 如何正确地将 .NET 字符串编码为 native 代码的 std::wstrings?

c++ - 使用自定义屏幕缓冲区在 Windows 控制台中启用 ANSI 颜色支持 (C++)