捕获正在运行的控制台应用程序的控

时间:2015-10-01 13:10:25

标签: delphi winapi windows-console

如何读取正在运行的控制台进程的输出?我找到一个snippet,通过在 CreateProcess()获得的进程句柄上使用 ReadFile()来展示如何为启动进程执行此操作,但我的问题是,我如何才能实现正在运行的流程?感谢。

我试过的是,在控制台应用上使用 OpenProcess()(我硬编码pid只是为了测试),然后我在其上使用 ReadFile(),但是我得到了一些粗俗的信件,或者根本没有向我展示任何东西。

编辑:这是我尝试过的代码,PID是硬编码的,只是为了测试。

procedure TForm1.Button1Click(Sender: TObject);
var
  hConsoleProcess: THandle;
  Buffer: Array[0..512] of ansichar;
  MyBuf: Array[0..512] of ansichar;
  bytesReaded: DWORD;
begin
  hConsoleProcess := OpenProcess(PROCESS_ALL_ACCESS, False, 6956);
  ReadFile(hConsoleProcess, Buffer, sizeof(Buffer), bytesReaded, nil);
  OemToCharA(Buffer, MyBuf);
  showmessage(string(MyBuf));

// ShellExecute(Handle, 'open', 'cmd.exe', '/k ipconfig', nil, SW_SHOWNORMAL);
end;

1 个答案:

答案 0 :(得分:0)

期望能够做到这一点是不现实的。也许有可能破解它,但这样做没有好处。您可以注入流程,使用GetStdHandle获取其标准输出句柄。从中读取。但正如我所说,没有好处。

为什么这个没有好处?那么,标准输入/输出是为单个阅读器和单个编写器设计的。如果你有两个读者,那么一个或两个读者都会错过一些文本。事实上,如果系统允许两个阻止同步调用ReadFile,我会感到惊讶。我希望第二个失败。 [Rob的评论解释说这是允许的,但它更像是先到先得。]

你可能做的是创建一个多播程序来收听主程序的输出。将主程序的输出传送到多个连铸机。让多个连接器回显其标准输出到一个或多个其他管道。

这里的底线是,无论您的实际问题是什么,将多个读者连接到标准输出都不是解决方案。