2010-04-15 148 views
3

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

我有这个,但它不工作:

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;    
    } 

回答

5

你必须使用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,因为窗口将不会创建和手柄到主窗口将为零(无效)工作。
因此,也许你可以正常启动进程,然后隐藏它。 :)

+0

否这个过程在Windows应用程序的整个生命周期中一直保持运行,因此一次数周/几个月。当我查看TaskManager时,它绝对存在并且正在运行。 – m3ntat 2010-04-15 18:36:36

+0

你说得对。实际上,控制台或没有控制台,一旦进程开始,它不起作用。我编辑了代码。你必须使用Windows API。 :) – Nayan 2010-04-15 19:06:12

+0

有关ShowWindow的更多信息,请点击这里http://www.pinvoke.net/default.aspx/user32/ShowWindow.html – Nayan 2010-04-15 19:08:05

1

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