【问题标题】:Hide console window from Process.Start C#从 Process.Start C# 隐藏控制台窗口
【发布时间】:2011-07-19 15:27:45
【问题描述】:

我正在尝试使用 System.Diagnostics.Process 类在远程计算机上创建进程。 我能够创建一个流程。但问题是,创建服务需要很长时间并且会显示控制台窗口。 另一个烦人的事情是控制台窗口显示在我的窗口窗体顶部,我无法在该窗体上执行任何其他操作。 我已经设置了所有属性,例如CreateNoWindow = true

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

但它仍然显示控制台窗口。即使我已经将输出和错误重定向到单独的流,但没有运气。

还有其他方法可以隐藏控制台窗口吗?请帮帮我。

这是我用来执行 sc 命令的部分代码。

Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.FileName = "sc";
proc.StartInfo.Arguments = string.Format(@"\\SYS25 create MySvc binPath= C:\mysvc.exe");
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.RedirectStandardOutput = false;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();

【问题讨论】:

  • 你试过设置proc.StartInfo.RedirectedStandardOutput = true吗?我已经让它与 Windows 应用程序一起使用。
  • 任何带有完整源代码示例的最终解决方案?
  • 在 Windows console 应用程序中,只需设置 UseShellExecute - 没有重定向或其他任何东西 - 对我有用。见here
  • 就控制台窗口打开和锁定表单而言,您应该将进程作为任务或在新线程上运行
  • 你为什么要设置UseShellExecuteCreateNoWindow两次?

标签: c# process console-application


【解决方案1】:

在尝试启动进程而不显示控制台窗口时,我遇到了类似的问题。我测试了几种不同的属性值组合,直到找到一个表现出我想要的行为的组合。

这是一个详细说明为什么必须将 UseShellExecute 属性设置为 false 的页面。
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

在页面的备注部分下:

如果 UseShellExecute 属性为 true 或 UserName 和 密码属性不为空,CreateNoWindow 属性 值被忽略并创建一个新窗口。

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = fullPath;
startInfo.Arguments = args;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;

Process processTemp = new Process();
processTemp.StartInfo = startInfo;
processTemp.EnableRaisingEvents = true;
try
{
    processTemp.Start();
}
catch (Exception e)
{
    throw;
}

【讨论】:

  • 想添加一些额外的细节吗? 为什么这有效,而不是如何
  • 是不是标准输出强制窗口存在?
  • 显然你不能在不设置startInfo.UseShellExecute = false;的情况下重定向标准输出
  • 我很好奇为什么在另一个答案中他们使用了 UseShellExecute = true? stackoverflow.com/questions/2317767/c-process-start-hide
  • 我永远无法理解为什么人们会捕捉到他们只是再次抛出的异常。
【解决方案2】:

这个答案我运气不好,这个过程(Wix light.exe)基本上出去吃午饭,没有及时回家吃晚饭。但是,以下内容对我来说效果很好:

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// etc, then start process

【讨论】:

  • 为我工作 - 又好又简单!
  • 这确实应该是公认的答案。像魅力一样工作。
  • CreateNoWindow = true 对我不起作用,这对我有用 :)
  • 只对有窗口的应用有效,控制台应用仍然显示窗口
  • 太棒了,为我工作。我正在执行 bat 文件,这个答案帮助了我。
【解决方案3】:

这应该可行,试试;


添加系统引用。

using System.Diagnostics;

然后使用此代码在隐藏的 CMD 窗口中运行您的命令。

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.Arguments = "Enter your command here";
cmd.Start();

【讨论】:

    【解决方案4】:

    这不显示窗口:

    Process cmd = new Process();
    cmd.StartInfo.FileName = "cmd.exe";
    cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    cmd.StartInfo.CreateNoWindow = true;
    
    ...
    cmd.Start();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2019-07-22
      • 2012-10-14
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多