2009-12-15 72 views
0

我正在創建一個應用程序,該應用程序有一個RichTextBox,它具有基於信息表示的不同顏色的文本(紅色表示錯誤,黑色表示標準消息等)。我試圖支持Windows主題,以及系統顏色的可能變化。爲此,我創建了一種基於Window系統顏色更改默認文本顏色的方法,通過使每種顏色變得更亮或更暗,使其對比良好。更改主題後Windows窗體應用程序退出

但是,在測試此係統時,我發現如果在程序運行時更改主題,它會默默退出,沒有任何解釋甚至是異常。它只是退出。我嘗試在Application.Run調用後放置一個斷點,並且在瀏覽器修改主題時,Windows會掛起「Please wait ...」屏幕。一分鐘後,屏幕消失了,果然,斷點已經被擊中,這意味着它不會徹底殺死這個過程。

我的問題是,爲什麼它這樣做,有沒有辦法阻止它這樣做?

謝謝。

回答

2

調試這個更好的方法是將FormClosing事件處理程序添加到您的窗體並在其上設置一個斷點。當它中斷時,callstack會顯示哪些代碼正在調用Close()方法。

您正在使用SystemEvents.UserPreferenceChanged事件的一種典型故障模式是在表單關閉時忘記註銷您的事件處理程序。這是一個靜態事件,它會阻止連接事件的表單被垃圾收集。當事件觸發時,你很可能會得到一個ObjectDisposedException。但這只是一個猜測。

+0

呸!你是對的,在FormClosing事件中設置斷點確實有幫助。看起來這是在執行'WndProc'覆蓋時調用'Application.Exit()'。我擁有它,所以如果壁紙發生變化,應用程序將退出。我通常只在其中一個配置中設置了編譯符號,但不知怎的,它以我的調試配置結束。不要問爲什麼我在壁紙變化時關閉它,這太複雜了......非常感謝! – mgbowen 2009-12-15 02:26:27

0

很長時間以來,ASP.NET開始做winform的時候,令人驚訝的是,它只是在沒有任何詞語的情況下吃了一些例外。您必須將Application.Run(新的MDIParent1())包裝在try catch塊中。

另外,你有:

Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false);