2010-07-22 63 views
1

我想在Windows加載時隱藏我的應用程序加載。我用參數創建了一個快捷方式,如果參數等於「WINDOWS」,我試圖隱藏表單。但無論我隱藏表單還是將可見性設置爲false,該表單總是顯示。我如何解決這個問題?隱藏在Dot Net Compact Framework中的啓動應用程序

[MTAThread] 
     static void Main(string[] args) 
     { 
      if (args.Length > 0) 
      { 
       Debug.WriteLine("Arguments were passed"); 
       foreach (string item in args) 
       { 
        MessageBox.Show(item); 
       } 


       Application.Run(new frmMain("WINDOWS")); 
      }  

     } 

和在frmMain

public frmMain(string Argument) 
     { 
      InitializeComponent(); 

      if (Argument != null && Argument != "") 
      {     
       if (Argument == "WINDOWS") 
       { 
        this.Visible = false; 
        //Hide(); 
       } 
      } 

但frmMain窗口的構造總是顯示。如何使它隱藏加載?

感謝名單很多提前:)

回答

1

用於Application.Run(Form)方法的定義是:

「開始運行當前線程上的標準應用程序消息循環,並且使指定的形式是可見的。」

您可以創建表單,然後進入睡眠或阻止狀態,直到您希望表單可見,然後在您創建表單時調用Application.Run()

如果應用程序需要甚至在顯示窗體之前執行任務,您可以將該代碼放在窗體的邏輯之外(或者甚至不使用窗體)。

+4

這回答應不** **被標記爲答案,因爲消息泵將不會被運行,除非Application.Run(...)被調用。而在Compact Framework中,唯一存在的Application.Run需要一個表單對象。 – erict 2011-04-18 22:40:44

3

我認爲正確的答案是,開始自己的消息泵。我從BenPas博客(以前的http://blog.xeviox.com)複製了以下代碼,我只能在Google的緩存中找到這些代碼 - 該頁面的鏈接已經死亡。但是我測試了代碼並且它工作正常。

using System.Runtime.InteropServices; 

[StructLayout(LayoutKind.Sequential)] 
public struct POINT 
{ 
    public int X; 
    public int Y; 

    public POINT(int x, int y) 
    { 
     this.X = x; 
     this.Y = y; 
    } 

    public static implicit operator System.Drawing.Point(POINT p) 
    { 
     return new System.Drawing.Point(p.X, p.Y); 
    } 
     public static implicit operator POINT(System.Drawing.Point p) 
    { 
     return new POINT(p.X, p.Y); 
    } 
} 

[StructLayout(LayoutKind.Sequential)] 
public struct MSG 
{ 
    public IntPtr hwnd; 
    public UInt32 message; 
    public IntPtr wParam; 
    public IntPtr lParam; 
    public UInt32 time; 
    public POINT pt; 
} 

[DllImport("coredll.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, 
    uint wMsgFilterMax); 

[DllImport("coredll.dll")] 
public static extern bool TranslateMessage([In] ref MSG lpMsg); 

[DllImport("coredll.dll")] 
public static extern IntPtr DispatchMessage([In] ref MSG lpmsg); 

這裏是你如何使用它來創建的messge循環:

[MTAThread] 
    static void Main() 
    { 
     HiddenForm f = new HiddenForm(); 

     MSG msg; 
     while(GetMessage(out msg, IntPtr.Zero, 0, 0)) 
     { 
      TranslateMessage(ref msg); 
      DispatchMessage(ref msg); 
     } 
    } 

通過上述定時器消息和基於回調執行Windows,但沒有窗口顯示,並沒有什麼被添加到任務欄。

相關問題