2009-02-24 80 views
2

我有一個使用顯示多個頂級窗口WinForms應用程序:C#的WinForms:多個頂級窗口和的ShowDialog()

Form1 form1 = new Form1(); 
form1.Show(); 
Form2 form2 = new Form2(); 
form2.Show(); 
Application.Run(); 

裏面在Form1的事件處理程序之一,我想是能夠顯示模態對話框:

Dialog dialog = new Dialog(); 
dialog.ShowDialog(form1); 

不掛起另一個頂層窗口。

這可能嗎?

回答

5

你需要在自己的STA線程上運行每個頂級窗口來實現這一點,我相信。

1

如果您需要另一種方法來運行多個UI線程,您可以處理WM_ENABLE消息並使用EnableWindow方法來防止禁用窗體。

0

一旦您顯示模式對話框,它將使同一STA線程上的所有其他窗口不可用。這背後的原因是模態對話框將開始攔截該特定線程的所有消息。在模式對話框關閉之前,其他頂層窗口將無法響應。

+1

窗口停止響應的原因是因爲.NET通過線程上的每個頂級窗口循環並調用EnableWindow(false)。 – 2009-02-24 17:01:09

2

有一個簡單的解決方案似乎正常工作。您可以簡單地檢查我們是否被禁用,並在需要時重新啓用。

[DllImport("user32.dll")] 
    private static extern void EnableWindow(IntPtr handle, bool enable); 

    protected override void WndProc(ref System.Windows.Forms.Message msg) 
    { 
     if (msg.Msg == 0x000a /* WM_ENABLE */ && msg.WParam == IntPtr.Zero) 
     { 
      EnableWindow(this.Handle, true); 
      return; 
     } 

     base.WndProc(ref msg); 
    }