2010-04-15 141 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()更改窗口樣式。但是,如上所述,如果您啓動隱藏的進程,則永遠不會顯示進程窗口。恕我直言,這是微軟應該修復的一個非常煩人的錯誤,但是,我只是通過顯示窗口然後隱藏它來解決它。不夠乾淨,並留下一點用戶界面(或任務欄)閃爍,但至少它工作。