4

我正在用 C# 构建一个自定义控制台界面 (Windows)。它只是将控制台的标准输入、输出和错误重定向到 WPF 应用程序中的文本框。在后台工作人员中,“cmd.exe”正在运行,每当它输出任何内容时,该输出都会进入文本框。

代码的一部分是这样的

private void SetBackgroundWorker()
{
    _worker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true };
    _worker.DoWork += (sender, args) => ReadOutput(_worker);
    _worker.ProgressChanged += (sender, args) => _window.UpdateConsole(args);
}

private void ReadOutput(BackgroundWorker worker)
{
    int count;
    var buffer = new char[1024];
    do
    {
        var builder = new StringBuilder();
        count = _process.Read(buffer, 0, 1024);
        builder.Append(buffer, 0, count);
        worker.ReportProgress(0, builder.ToString());

    } while (count > 0);
}

然后,我可以在这个界面中执行“git add”、“git status”或“git commit”命令(我在 PATH 中添加了 git bin 目录的路径),但是当我尝试“git push origin master”时,文本框没有更新。我希望“'...'的用户名”和“'...'的密码”,但它永远不会发生。

当我在命令提示符下执行“git push ...”时,它会显示它们,但在我的 wpf 界面中,“cmd.exe”似乎根本没有重定向输出,我在这里迷路了

我认为我可以尝试的一件事是放弃重定向,并使用 Windows api 来挂钩 cmd.exe,但它会更复杂。

如果您能给我建议,我将不胜感激。

如果您想查看完整代码并对其进行测试,代码位于https://github.com/andrewchaa/ConsolePlus。它处于一个非常原始的阶段。

4

2 回答 2

3

我想这是应用程序正在使用像WriteConsole这样直接写入屏幕缓冲区的东西,没有办法拦截它——尤其是标准输出/标准错误重定向。我现在不具体说 git 应用程序在做什么;但它确实经常使用颜色,这似乎需要使用像SetConsoleTextAttribute这样也直接处理屏幕内存的函数。

于 2012-09-11T17:42:22.903 回答
2

似乎 git.exe 将其输出写入 stdErr。

于 2015-07-09T13:20:17.890 回答