2013-06-24 47 views
3

我正在使用Windows窗體應用程序.NET 3.5。我設置了一個定時器,使得如果沒有活動在一定時間內目前的形式被關閉後用戶返回到默認表「中沒有登錄」,這顯示某些信息,但不允許訪問其他形式。關閉所有打開的WinForms,但只有一個?

Application.OpenForms給我一個名單,讓我關閉可能是打開的大多數形式,但Application.OpenForms似乎意識到只有MDI形式。其中一些MDI表單可能具有MessageBox或其他模式形式。甚至有些情況下模態形式本身具有彈出對話框。

我知道這個怪癖(bug) in Application.OpenForms,我不認爲有任何情況下,在創建了一個Messagebox或其他類似的表單後,屬性會被改變。在任何情況下,這應該隻影響這些表單,所有其他應該仍然在ApplicationOpenForms中列出。

是否有遍歷和關閉任何類型的各種形式的應用程序,除了一個我很在乎一個優雅的方式? (或者嚴格把關,全部關閉,但MDI父然後打開一個我所關心的。)

+0

,我覺得一個'foreach'環路將很好地在這裏工作。 – Brian

+0

這變得非常混亂,特別是當有一個開放的'MessageBox'窗口(即'MessageBox.Show')時。一般情況下,模態形式是有問題的,因爲你不能關閉它們。你必須模擬按下「取消」按鈕,你必須按照正確的順序處理模態形式。準備在這個問題上花費大量的時間。 –

+0

你試圖實現的東西,已經視窗知道怎麼做。並做得很好,非常安全。經過一段時間不活動後,自動工作站鎖定非常簡單。事實上,大多數關心安全性的公司都已經這樣做了。添加你自己的東西不僅很難,它永遠不會像Windows那樣安全。特別是你處理密碼的部分代碼。 –

回答

0

你可以考慮註冊形式與數據結構中的手柄/基準(如定義爲單數組)作爲一旦創建它。

使用這種方法,你將有創造的一切形式和潛在的甚至可以存儲在相同結構的其他感興趣的信息。一旦你的列表,你可以在第二個線程運行一個工作進程基於存儲在數據結構

+0

某處,某種程度上,Windows已經擁有應用程序擁有的所有表單的列表,包括MessageBoxes等。這正是我不想重新發明的輪子。 – mickeyf

1

這對我來說是98%的答案,也許是100%爲他人信息做清理工作。

在幾乎所有情況下,被賦予麻煩形式是簡單地通知或確認,即「記錄保存」,或者「你真的要取消?」並使用MessageBox實現。所需要的只是創建我自己的與MessageBox在功能上等效的表單,並在MDI子代中創建一個需要它的實例,然後使用它。當MDI子窗體關閉時(通過遍歷Application.OpenForms找到),模式確認窗體也關閉。我想象,MessageBox沒有關閉的原因是因爲它實際上並不是由MDI子窗體擁有的。 (MSDN:「你不能創建一個MessageBox類的新實例。」)

當然,我不需要複製整個MessageBox功能,在大多數情況下,我真正需要的只是一個文本框和幾個按鈕。

其他內置的Windows形式,如PrintDialog類和FileOpenDialog有問題,類似的MessageBox。我沒有費力去重新創建我自己的版本。如果一個人意外地被打開,沒有造成很大的傷害。這隻會在有人走開PrintDialog和實際點擊PrintDialog表單上的Print按鈕之間走開,然後在不活動計時器到期之前不會回來。

有可能是將消息發送到這些類型的形式告訴他們關閉一個比較簡單的方法 - 最壞的情況下,看看他們和使用低水平Windows消息。

相關問題