C#-从新进程的子窗口捕获输出

本文关键字:窗口 输出 新进程 进程 C#- | 更新日期: 2023-09-27 18:28:16

好吧,我不会在我所做的事情周围蹦蹦跳跳。坦率地说,我正试图用C#为虚幻开发工具包制作一个GUI虚幻脚本编译器。确切的性质是更大的东西,但这就是正在发生的事情:

我启动了一个新线程来启动一个新进程,并设置了一个流读取器,该流读取器具有一个侦听器来捕获写入控制台窗口的输出。这不是问题,只是在启动UDK.exe make时,它似乎生成了一个子控制台窗口,这就是实际的编译器。如果我将CD转移到我的UDK/Binaries/Win32目录,并执行命令UDK.exe make >> output.txt,则绝对不会写入任何内容,但会创建文件(当然编译器也会运行)

我正在使用(据我所知)线程安全操作来访问我的输出文本框,我想在编译器运行时写入该文本框。

这是我的代码:

public partial class ProjectEditor : Form
{
   delegate void SetTextCallback(string text);
   /*** ... other completely unrealted code ... ***/
   private void Menu_Project_Compile_JustCompile_Click(object sender, EventArgs e) {
        Thread compile = new Thread( 
            new ThreadStart (
                this.Compile
            )
        );
        NewConsoleLine("Starting Compiler New");
        compile.Start();
    }

    ////////
    private void Compile() {
        this.RunWithRedirect(FileMan.getUDK(), " make");
    }
    void RunWithRedirect(string cmdPath, string args = null) {
        var proc = new Process();
        proc.StartInfo.FileName = cmdPath;
        proc.StartInfo.Arguments = args;
        proc.StartInfo.RedirectStandardOutput = true;
        proc.StartInfo.RedirectStandardError = true;
        proc.EnableRaisingEvents = true;
        proc.StartInfo.CreateNoWindow = true;
        proc.StartInfo.UseShellExecute = false;
        proc.ErrorDataReceived += proc_DataReceived;
        proc.OutputDataReceived += proc_DataReceived;
        proc.Start();
        proc.BeginErrorReadLine();
        proc.BeginOutputReadLine();
        proc.WaitForExit();
    }
    void proc_DataReceived(object sender, DataReceivedEventArgs e) {
        NewConsoleLine(e.Data);
    }
    void NewConsoleLine(String text) {
        if (this.OutputConsole.InvokeRequired) {
            SetTextCallback d = new SetTextCallback(NewConsoleLine);
            this.Invoke(d, new object[] { text });
        } else {
            OutputConsole.Text += text + "'n";
        }
    }
}

目前,当我执行要编译的方法时,我的控制台会被写入Starting Compiler New行,并显示一个UDK.exe控制台窗口,它挂在那里,似乎永远没有输出。

有人知道如何调整我的拖缆以捕捉实际输出吗?我知道这是可能的,因为我已经看到其他用于UnrealScript的IDE实现了这种效果(没有弹出窗口,完整的输出实时写入控制台窗口)我能感觉到我很接近,但我只是还没有完全到达。。。

C#-从新进程的子窗口捕获输出

尝试运行UDK.com make。这将在启动编译器的同一窗口中运行编译器。