返回

C# 重定向进程标准输入输出,同时保持 UI 可见性

windows

如何在 C# 中重定向具有 UI 的进程的标准输入和输出

问题:重定向与 UI 可见性

在 Windows 系统中,重定向具有 UI 的进程的标准输入时,其窗口会变得不可见。这是因为重定向输入流会阻止进程创建和显示其图形界面。

解决方法:平衡重定向和可见性

为了解决这一挑战,需要采取分步方法:

步骤指南

1. 初始化进程并设置重定向

// 初始化进程启动信息
ProcessStartInfo startInfo = new()
{
    FileName = @"C:\Program Files\YourApp\YourApp.exe",
    WorkingDirectory = @"C:\Program Files\YourApp",
    UseShellExecute = false,
    WindowStyle = ProcessWindowStyle.Normal,
    CreateNoWindow = false,
    RedirectStandardOutput = true,
};

// 创建并启动进程
Process process = new()
{
    StartInfo = startInfo,
    EnableRaisingEvents = true,
};

process.Start();

2. 处理进程输出

在启动进程后,使用 BeginOutputReadLine 方法在后台读取标准输出:

process.BeginOutputReadLine();

3. 延迟重定向标准输入

为了在启动进程后保留其 UI 可见性,延迟设置 RedirectStandardInputtrue。这里使用计时器来实现延迟:

Timer timer = new()
{
    Interval = 2000, // 延迟 2 秒
};

timer.Tick += (sender, e) =>
{
    // 延迟后设置重定向
    process.StartInfo.RedirectStandardInput = true;
    process.StartInfo.UseShellExecute = false;
    process.Start();

    // 停止计时器
    timer.Stop();
};

timer.Start();

4. 写入标准输入

延迟后,现在可以安全地重定向标准输入并写入它:

StreamWriter writer = process.StandardInput;
writer.WriteLine("Hello from the main process!");

常见问题解答

Q1:为什么重定向标准输入会使 UI 窗口不可见?

A1:在 Windows 系统中,重定向输入流会阻止进程创建和显示其图形界面,导致 UI 窗口不可见。

Q2:如何解决重定向与 UI 可见性之间的冲突?

A2:通过延迟设置 RedirectStandardInputtrue,可以在进程启动后保持其 UI 可见性。

Q3:延迟重定向标准输入会影响进程输出吗?

A3:否,延迟重定向标准输入不会影响进程输出。在延迟期间,进程的标准输出仍然可供读取。

Q4:是否可以同时重定向标准输入和输出?

A4:是的,按照本文中的步骤,可以同时重定向标准输入和输出,同时保持进程的可见性和交互性。

Q5:这个方法适用于所有 Windows 版本吗?

A5:是的,本文中的方法适用于 Windows 系统的各个版本。