C# – 启动Invisible Process(CreateNoWindow和WindowStyle不工作?)

我有两个程序(.exe),我在.NET中创建。 我们称他们为师父和工人。 大师启动1个或更多工人。 Worker 不会与用户交互,但它是一个WinForms应用程序,它接收命令并根据从Master接收的命令运行WinForms组件。

我希望Worker应用程序完全隐藏运行 (当然,除了显示在任务管理器中)。 我认为我可以使用StartInfo.CreateNoWindowStartInfo.WindowStyle属性完成此操作 ,但我仍然在表单中看到Client.exe窗口和组件。 但是,它不会显示在任务栏中。

Process process = new Process { EnableRaisingEvents = true, StartInfo = { CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden FileName = "Client.exe", UseShellExecute = false, ErrorDialog = false, } }; 

我需要做什么才能让Client.exe运行但不显示?

你在使用notepad.exe的系统上使用CreateNoWindow / WindowStyle可以正常工作(例如它被隐藏但在后台运行),所以它可能是WinForms应用程序正在做的事情。 一些想法:

选项1:如果您控制WinForms工作进程,则可以覆盖Control.SetVisibleCore以始终隐藏表单。 如果您不想总是隐藏它,可以将命令行参数传递给它,例如/hide将导致它被隐藏。 示例(假设表单已经存在代码隐藏):

 public partial class MyForm : Form { public MyForm() { InitializeComponent(); } protected override void SetVisibleCore(bool value) { // You'd probably want to parse the command line. if (Environment.CommandLine.Contains("/hide")) base.SetVisibleCore(false); else base.SetVisibleCore(value); } } 

这样,运行MyForm.exe导致具有可见表单的进程。 运行MyForm.exe /hide导致具有隐藏表单的进程。 您可以从主进程传递/hide参数,因此运行该应用程序的普通用户仍然可以看到它。

选项2:您可以通过对ShowWindow进行P / Invoke来启动应用程序。 有关这方面的更多信息。 这样做的缺点是,在隐藏之前,您有时可以看到工作窗口闪烁。 例:

 class Program { public static void Main(string[] args) { ProcessStartInfo psi = new ProcessStartInfo() { FileName = @"C:\windows\system32\notepad.exe", }; Process process = Process.Start(psi); // Wait until the process has a main window handle. while (process.MainWindowHandle == IntPtr.Zero) { process.Refresh(); } ShowWindow(process.MainWindowHandle, SW_HIDE); } const int SW_HIDE = 0; [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); } 

问题出在UseShellExecute = false ,将其设置为true ,进程将以隐藏方式启动。 使用shell启动进程了解如何隐藏应用程序,直接使用UseShellExecute = false启动进程直接启动进程,正如Chris Schmich所提到的,您必须处理从客户端应用程序内部隐藏窗口。 如果您希望手动运行应用程序以进行调试或测试,则可能需要这样做。

你必须添加base.Visibility = Visibility.Hidden; 在Win Form应用程序构造函数中。