通过C#执行外部程序而不显示控制台

3
我正在尝试从我的C#控制台应用程序运行VLC,但我无法实现。我知道还有其他类似的问题(例如在不分散控制台窗口的情况下在C#中运行进程C# 运行外部控制台应用程序且没有输出?C#: 将外部控制台程序作为隐藏运行),从这些问题中我提取了以下代码:
        Process process = new Process();
        process.StartInfo.FileName = "C:\\Users\\XXXXX\\Desktop\\VLC\\vlc.exe";
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.CreateNoWindow = true;
        //process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        process.StartInfo.Arguments = " -I dummy";

        process.Start();

然而,当我注释和取消注释WindowStyle行时,控制台仍然出现。有什么问题吗?

什么是VLC?VLC是否可能实例化自己的控制台窗口? - Wagner DosAnjos
这是http://www.videolan.org/。是的,可能是这样。通过“-I dummy”我避免了启动UI界面。 - Manu
我安装了VLC并尝试从命令行使用“-I dummy”。它确实启动了第二个窗口。看起来你可能需要编程找到那个窗口并将其隐藏。 - Wagner DosAnjos
嗯... agat 建议使用 FindWindow,但我无法将它隐藏:我认为我找不到它的名称。而且,如果我去掉 -I dummy,正常的用户界面就会启动;如果我寻找名称,就没有运气。 - Manu
3个回答

2
请尝试以下命令行开关。这里有文档记录,详见此处
process.StartInfo.Arguments = "-I dummy --dummy-quiet";

1

如所示这里,只需按照以下操作:

using System.Runtime.InteropServices;

...
  [DllImport("user32.dll")]
  public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);

  [DllImport("user32.dll")]
  static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

...

     //Sometimes System.Windows.Forms.Application.ExecutablePath works for the caption depending on the system you are running under.
     IntPtr hWnd = FindWindow(null, "Your console windows caption"); //put your console window caption here
     if(hWnd != IntPtr.Zero)
     {
        //Hide the window
        ShowWindow(hWnd, 0); // 0 = SW_HIDE
     }


     if(hWnd != IntPtr.Zero)
     {
        //Show window again
        ShowWindow(hWnd, 1); //1 = SW_SHOWNORMA
     }

更新:

在启动进程后,您还应该添加WaitForInputIdle:

process.Start();
process.WaitForInputIdle();

仍然显示。我在类定义中添加了DllImport,并在Main方法中添加了以下代码。没有运气。我只能隐藏启动应用程序,而不能隐藏已启动的应用程序。 - Manu
是的。没错,你应该寻找已执行的应用程序窗口,而不是正在执行的。 - Agat
嗯...但窗口标题不会是路径。你应该以其他方式找到它。尝试类似这样的方法:http://superuser.com/questions/378790/how-to-get-window-title-in-windows-from-shell。 - Agat
它显示的名称是 C:\Users\XXXXX\Desktop\VLC\vlc.exe。 - Manu
好的。我已经尝试了所有的东西...现在它甚至对我起作用了。你还应该在process.Start()之后添加这一行:process.WaitForInputIdle(); - Agat
显示剩余2条评论

0
你可以在项目属性中简单地更改输出类型为Windows应用程序。 只需右键单击项目 > 属性 > 应用程序。

那不起作用:问题出在外部启动的进程上。 - Manu
很奇怪,它在我这里运行正常,也许是VLC本身出了问题?尝试启动另一个程序。 - Nathan Abramov

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