在运行时切换Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

我想在运行时切换进程的可见性 ,我有一个Windows窗体应用程序,它通过一个进程启动默认隐藏的另一个控制台应用程序,但我想允许管理员用户通过复选框切换此状态并显示控制台应用程序他们选择。

我有这个,但它不起作用:

private void checkBox1_CheckedChanged(object sender, EventArgs e) { ProcessWindowStyle state = cvarDataServiceProcess.StartInfo.WindowStyle; if (state == ProcessWindowStyle.Hidden) cvarDataServiceProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal; else if (state == ProcessWindowStyle.Normal) cvarDataServiceProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; } 

您必须使用Win32 API。

  [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); ProcessWindowStyle state = ProcessWindowStyle.Normal; void toggle() { if (cvarDataServiceProcess.HasExited) { MessageBox.Show("terminated"); } else { if (cvarDataServiceProcess.MainWindowHandle != IntPtr.Zero) { if (state == ProcessWindowStyle.Hidden) { //normal state = ProcessWindowStyle.Normal; ShowWindow(cvarDataServiceProcess.MainWindowHandle, 1); } else if (state == ProcessWindowStyle.Normal) { //hidden state = ProcessWindowStyle.Hidden; ShowWindow(cvarDataServiceProcess.MainWindowHandle, 0); } } } } 

但是,当hidden启动进程时,这将不起作用,因为将不会创建窗口并且主窗口的句柄将为零(无效)。
所以,也许你可以正常启动这个过程然后隐藏它。 🙂

在启动进程后,不使用Process.StartInfo.WindowStyle,而是使用Process.ShowWindow()来更改窗口样式。 但是,如上所述,如果您启动隐藏的过程,则永远不会显示过程窗口。 恕我直言,这是一个非常烦人的错误,微软应该修复,但唉,我只是通过显示窗口然后隐藏它来解决它。 不那么干净,并留下一点用户界面(或任务栏)闪烁,但至少它是有效的。