从Process.Start C#隐藏控制台窗口


102

我正在尝试使用System.Diagnostics.Process类在远程计算机上创建进程。我能够创建一个过程。但是问题是,创建服务需要很长时间,并且会显示控制台窗口。另一个烦人的事情是控制台窗口显示在我的Windows窗体顶部,而我无法对该窗体执行任何其他操作。我已将所有属性设置为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应用程序一起使用。
poy 2012年

有完整源代码示例的最终解决方案吗?
Kiquenet

在Windows 控制台应用程序中,只需设置UseShellExecute-不带重定向或其他任何设置-对我有用。看这里
保罗

只要打开控制台窗口并锁定表单,您就应该以“任务”或新线程运行进程
Ryan Dooley '18

你为什么要设置UseShellExecuteCreateNoWindow两次?
Mike Lowery

Answers:


119

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

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

在页面的“备注”部分下:

如果UseShellExecute属性为true或UserName和Password属性不为null,则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;
}

2
想要添加其他详细信息吗?在为什么这个作品,而不是如何
Aqua

2
是否因为标准输出强制窗口存在?
丹妮丝·斯基德莫尔

1
显然,如果没有设置,您将无法重定向标准输出startInfo.UseShellExecute = false;
Denise Skidmore

1
我很好奇为什么在另一个答案中他们使用UseShellExecute = true? stackoverflow.com/questions/2317767/c-process-start-hide
Denise Skidmore

10
我永远也不会明白为什么人们会发现一个异常,无论如何他们还是会再次抛出异常。
布林迪2015年

54

我对这个答案很不走运,因为该过程(Wix light.exe)本质上是在吃午餐,而不能及时回家吃晚饭。但是,以下对我来说效果很好:

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

2
为我工作-很好很简单!
J c

2
这确实应该是公认的答案。奇迹般有效。
Eternal21

2
CreateNoWindow = true不适用于我,但确实
有用

3
它仅适用于带有窗口的应用程序,控制台应用程序仍显示窗口
Geograph

18

这应该工作,尝试;


添加系统参考。

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();

11

这不会显示窗口:

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

...
cmd.Start();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.