2010-03-25 33 views
2

我的應用程序使用多個窗口的WinForms:如何確定窗口不再有效(無子窗口具有焦點)?

我想隱藏的情況下,一個特定的窗口的應用程序失去焦點(當活動窗口不是應用程序窗口)source

我處理Deactivate事件我的主要形式。

private void MainForm_Deactivate(object sender, EventArgs e) 
    { 
     Console.WriteLine("deactivate"); 
     if (GetActiveWindow() == this.Handle) 
     { 
     Console.WriteLine("isactive=true"); 
     } 
     else 
     { 
     Console.WriteLine("isactive=false"); 
     } 
    } 

[DllImport("user32.dll")] 
static extern IntPtr GetActiveWindow(); 

輸出始終

deactivate 
isactive=true 

,如果我的應用程序中的一個新的窗口接收焦點並且如果我點擊進入一個不同的應用程序我觀察到相同的行爲。

我希望GetActiveWindowDeactivate處理程序調用時返回新的活動窗口的句柄。相反,它總是返回我的應用程序窗口的句柄。

這怎麼可能?停用事件是否「過早」處理? (雖然主要形式仍然活躍?)。

我如何檢測我的應用程序已失去焦點(我的應用程序窗口不是活動窗口)和其他應用程序獲得它沒有一個計時器運行GetActiveWindow?

+0

我們是在談論一個MDI應用程序? – Bobby 2010-03-25 16:27:22

+0

不,這不是一個MDI應用 – Marek 2010-03-25 16:28:52

回答

3

從我所看到的GetActiveWindow get的調用線程,即您的應用程序的活動窗口,因此它總是會返回您的應用程序的當前窗口。我想也許你正在尋找GetForegroundWindow,它會把句柄返回到用戶當前激活的窗口。

+0

是,GetForegroundWindow做的。謝謝! – Marek 2010-03-25 16:30:02

+2

好點。請注意,順便說一句,'GetForegroundWindow'可能在某些情況下返回NULL(例如通過單擊任務欄按鈕切換焦點)。 – Thomas 2010-03-25 16:30:22

+0

@Thomas,很好的編程實踐,即使你不期待它,但很好地突出它(+1),以檢查NULL, – Lazarus 2010-03-25 16:54:37

0

我觀察相同的行爲(.NET 3.5,Visual Studio 2008中)。該文檔模糊:

當窗體失去焦點並且不再是活動窗體時發生。

但是,事件名稱之間的對比度(激活d與停用)表明事件不實際關閉前已經來了。