2011-09-08 57 views
2

我的Windows窗體應用程序啓動另一個;後者意味着保持隱藏,並且在用戶按下F9鍵時出現並消失。隱藏窗體出現在左下角

我需要隱藏窗體才能在另一個進程中運行,所以我使用了Process.Start。但是,無論我做什麼,我都無法讓表單隱藏起來。它總是出現在左下角,奇怪的是,它只顯示標題欄,從中我可以最大化它。這是不希望的。

我試着調整了StartInfoShellExecute = falseCreateNoWindow = trueWindowStyle = ProcessWindowStyleHidden,你的名字。

我也試過去表單的設計師,並設置ShowInTaskbar爲假,但沒有雪茄。當我嘗試這樣做時,引起我注意的一件事是WindowState屬性只能設置爲正常,最小化或最大化,而不是隱藏。

我難倒。有什麼建議麼? (除開溝Windows窗體,這是遺留代碼)

編輯 :(非常重要)我忘了提及我的主應用程序是全屏,並且Windows桌面被鎖定。也就是說,當機器啓動時,我的主應用程序啓動而不是資源管理器

+0

如果隱藏的表單是您自己的代碼庫(一個任務,但必須運行異步的獨立進程)的一部分,我們可以幫助您編寫異步代碼,因此您不需要單獨的進程。另外請注意,WinForms現在已經很老了,但它絕對不是遺產。這是一個絕對的要求,這是它自己的AppDomain中的一個單獨的過程? –

+0

是的,先生,它絕對是一個單獨的應用程序。不知道AppDomains,也許我應該使用它來代替'Process.Start()'?怎麼樣? –

+0

這隻能在您啓動的應用程序內完成,而不能從您的外殼替換。目前尚不清楚這是否適合您的問題。 –

回答

0

我很久以前解決了這個問題,但忘了發佈我的解決方案。關鍵是要將表單創建爲最小化。在設計中,InitializeComponent,我說:

TopMost = true; 
TopLevel = true; 
WindowState = System.Windows.Forms.FormWindowState.Minimized; 

而且,良好的措施,我呼籲InitializeComponent後做了一次(有一種幾乎難以察覺的閃爍,但它的工作原理):

public void Init(bool pQueryAndRetrieveForm, ref bool pIsOpen) { 
     InitializeComponent(); 
     WindowState = FormWindowState.Minimized; 
     //More initialization code... 
} 
0

你只是試圖實現異步處理?例如,讓您的主表單處理,而其他的東西工作?如果你想異步處理另一組代碼/數據,爲什麼不建立一個線程在後臺完成你的任務?例如

在C#中,

public Form1() 
    { 
     InitializeComponent(); 
     new Thread(() => DoSomethingAsync()); 
    } 

    private void DoSomethingAsync() 
    { 
     // Do Something 
    } 

這將使你的代碼塊沒有鎖定你的主線程來處理。您可以根據您的情況(如後臺工作者,線程池或一次性線程)以多種方式完成相同的邏輯。這完全取決於你的要求。

+0

對不起,它必須在一個單獨的過程中完成 –

1

表單應該有一個名爲「Visible」的屬性如果將其設置爲False,我不確定它會捕獲您的F9鍵。

但是,您應該能夠將Left和Top屬性設置爲屏幕邊界外的值,然後在需要時恢復相應的值。

喜歡的東西

Form1.Top= 3000 
Form1.Left = 3000 

Form1.Top = _appropriateTop 
Form1.Left = _appropriateLeft 
+0

是的,我知道那個屬性。我嘗試在'InitializeComponent()'中將其設置爲false,但CLR將其更改爲True,以便從'Process.Start'調用的某一行開始...我可以儘快將其設置爲false,但是然後再次,形式將是可見的,而...我會考慮改變位置,作爲最後的手段,必須有一個更好的解決方案 –

+0

另一種可能是不透明度屬性設置爲0 – mhttk

1

隱藏在啓動一個WinForm。這對我有用。

public Form1() 
    { 
     InitializeComponent(); 
     var t = new Thread(new ThreadStart(HideThisForm)); 
     t.Start(); 
    } 

    delegate void FormCallback(); 
    void HideThisForm() 
    { 
     if (this.InvokeRequired) 
     { 
      var d = new FormCallback(HideThisForm); 
      this.Invoke(d); 
     } 
     else 
     { 
      this.Hide(); 
     } 
    } 
+0

不能做到這一點,他們必須保持完全獨立的流程。也許我可以用其他方式啓動第二個應用程序,而不是使用'Process.Start'...? –

+0

我的不好,我在想單獨的線程,而不是過程。嘗試新的例子。 – JimSTAT