【问题标题】:Launching process in C# Without Distracting Console Window在 C# 中启动进程而不分散控制台窗口
【发布时间】:2010-10-18 20:30:23
【问题描述】:

我知道如何启动一个进程。但我现在的问题是控制台窗口(在本例中为 7z)弹出最前面挡住了我的视线并移开我的注意力,打断了我的句子,或者我每隔几秒钟就在做。它非常烦人,我该如何防止这种情况发生。我认为 CreateNoWindow 解决了这个问题,但它没有。

注意:有时控制台需要用户输入(是否替换文件)。所以完全隐藏它可能是一个问题。

这是我当前的代码。

void doSomething(...)
{
    myProcess.StartInfo.FileName = ...;
    myProcess.StartInfo.Arguments = ...;
    myProcess.StartInfo.CreateNoWindow = true;
    myProcess.Start();
    myProcess.WaitForExit();
}

【问题讨论】:

  • 我想我记得上一份工作中使用 CreateNoWindow 时它不起作用。

标签: c# process


【解决方案1】:

如果我没记错的话,这对我有用

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 时,我在默认控制台中没有得到任何输出,注释该行在默认控制台中给了我输出(我正在创建一个控制台应用程序) .
  • 这似乎会导致process.WaitForExit 出现问题。我最终改用process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden,这似乎工作正常。
  • @oscilatingcretin WaitForExit 可能由于标准输出的缓冲区大小有限而导致死锁。解决它的正确方法是在调用 WaitForExit 方法之前读取 StandardOutput。 stackoverflow.com/a/139604/852284
【解决方案2】:

@galets 在您的建议中,窗口仍然被创建,只是它开始最小化。这对于实际做 acidzombie24 想要的事情会更好:

myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

【讨论】:

  • 优秀的建议!!非常感谢。
【解决方案3】:

试试这个:

myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;

【讨论】:

  • 已经尝试了一切,这是唯一有效的方法
【解决方案4】:

我必须仔细检查,但我相信您还需要设置 UseShellExecute = false。这还可以让您捕获标准输出/错误流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多