在C#中启动进程而不干扰控制台窗口

65
我知道如何启动一个进程。但我的问题是控制台窗口(在这种情况下为7z)会在最前方弹出,挡住我的视线并消除我的焦点,并且每隔几秒钟干扰我的句子或其他事情。这非常令人恼火,我应该怎么避免这种情况发生?我认为CreateNoWindow可以解决这个问题,但实际上没有。
注意:有时需要用户输入控制台(替换文件还是不替换)。因此完全隐藏它可能会成为一个问题。
这是我的当前代码。
void doSomething(...)
{
    myProcess.StartInfo.FileName = ...;
    myProcess.StartInfo.Arguments = ...;
    myProcess.StartInfo.CreateNoWindow = true;
    myProcess.Start();
    myProcess.WaitForExit();
}

4
我记得在我上一份工作中使用CreateNoWindow时它好像没有起作用。 - André Chalella
4个回答

99

如果我记得正确,这对我起作用了

Process process = new Process();

// Stop the process from opening a new window
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;

// Setup executable and parameters
process.StartInfo.FileName = @"c:\test.exe"
process.StartInfo.Arguments = "--test";

// Go
process.Start();

我一直在使用这段代码从C#控制台应用程序中启动另一个进程,它会阻止应用程序将其启动在单独的窗口中,而是保持所有内容在同一个窗口中。


当我将 RedirectStandardOutput 设置为 true 时,我没有在默认控制台中获得任何输出,注释掉该行代码后,我在默认控制台中获得了输出(我正在创建一个控制台应用程序)。 - MDMoore313
3
这似乎会导致process.WaitForExit出现问题。我最终使用了process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden,这似乎可以正常工作。 - oscilatingcretin
@oscilatingcretin WaitForExit可能会导致死锁,因为标准输出缓冲区的大小受限。解决问题的正确方法是在调用WaitForExit方法之前读取StandardOutput。https://dev59.com/bnVC5IYBdhLWcg3w9F89#139604 - nicolas2008

28

@galets在你的建议中,窗口仍然会被创建,只是开始时处于最小化状态。这种方法更适合实际执行acidzombie24想要的操作:

myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

非常出色的建议!非常感谢。 - DoubleDunk

4

试试这个:

myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;

尝试了所有的方法,只有这个有效。 - Valamas

3

我需要再确认一下,但我认为你还需要设置UseShellExecute = false。这也让你可以捕获标准输出/错误流。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接