2010-08-15 31 views
2

我的應用程序通知圖標相應地顯示並隱藏主應用程序窗口。但是,當打開一個模式對話框時(這可以是關於對話框或設置對話框,僅舉幾例),我想要模態對話框來獲得焦點,而不是顯示/隱藏主應用程序窗口。如何將焦點的模式對話框點擊C#中的通知圖標?

模式對話框以form.ShowDialog(this)打開。假設我用該代碼打開關於窗口,然後在不關閉它的情況下移動到另一個應用程序。當我回來時,如果我點擊通知圖標,我希望我的應用程序能夠獲得焦點。更好的是,我想要模態對話框來獲得焦點原因,因爲它是模態的,我無法使用父窗體。

我跟蹤一個簡單的bool變量,如果任何窗體(關於,設置等)被打開,當我點擊通知圖標時,我檢查該變量。如果這是真的,我會做一些像mainForm.Activate()。這實際上將主窗體和模態對話框帶到前面,唯一的問題是它不會集中模態對話框。

如何在不跟蹤打開哪個模式對話框的情況下解決此問題並致電.Activate()?導致這將是一種痛苦...

回答

1

就像我在評論中說的,我的解決方案最終使用Windows API。

基本上我跟蹤任何打開模式對話框與bool變量。當通知圖標被點擊時,如果變量爲false,則繼續,如果爲true,則調用下面的方法並停止該點處的代碼執行(在通知圖標點擊事件中)。

internal static void BringModalDialogToFront() { 
    mainForm.Activate(); 
    SetForegroundWindow(GetWindow(mainForm.Handle, GW_ENABLEDPOPUP)); 
} 

這很容易解決我的問題。

1

當您激活主窗口時,您是否在模態對話框中看到Activate()事件?如果是這樣,請將SetFocus調用到那裏的模態。

如果沒有,那麼當您在主窗口中獲得Activate事件時,檢查該(或任何)對話框是否已打開,並在適當的情況下直接調用它的Activate或可能是SetFocus。

因爲您正在主窗口中獲取Activate事件,所以通過函數調用將其傳播到模態對話框。

國際海事組織,試圖讓所有這些工作沒有直接干預將是更多的痛苦比直接工作。

HTH

+0

問題是,這些模態對話框中的某些與關於/設置不完全相同。其中一些是我使用的庫中的任務對話框,我相信它使用Vista中引入的新的任務對話框API。那些沒有Activate事件。 – 2010-08-15 16:27:08

+1

任務對話框是否有一個公共的SetFocus()函數?如果沒有,你可以將焦點設置爲一個控件,一個按鈕,一個文本框,以及對話框中需要關注的任何類型的控件嗎?我想你可以通過序號獲得控制權;可以說,「第一控制」,所以它將是一個通用的解決方案。也就是說,不是綁定到特定的對話框。 – JustBoo 2010-08-15 16:36:31

+0

不幸的是,沒有任何對話框,也沒有任何控制需要關注:(但我認爲我通過訴諸於Windows API,更具體地使用'SetForegroundWindow()'和'GetWindow()'來解決我的問題。 – 2010-08-15 17:32:38

相關問題