2014-03-06 59 views
0

我的一個Delphi XE2程序在運行和閒置時'阻止Windows關機'。我的大部分應用程序都不是這樣,我需要解決它。在XP上,Windows默默無法關閉;在Win7上,對話框顯示我的應用程序阻止關機。什麼可能導致Delphi程序「阻止Windows關機」?

與此處的類似問題不同,程序是單線程的,我沒有使用托盤,並且暫時斷開了主窗體中的OnCloseQuery和FormClose事件以及具有它們的一個子窗體。在正常使用中,程序乾淨地關閉,並且在Process Explorer中沒有任何痕跡。

我已經試驗性地添加了WM_QueryEndSession和WM_EndSession處理程序,它們將日誌消息寫入Windows事件日誌。在測試Windows關閉時,只有前者發生,Wparam和Lparam都爲零。

如果有什麼可能導致這種情況,或者如何進一步調查,我將不勝感激。我不願意在不知道發生了什麼的情況下嘗試調用WM_QueryEndSession上的Halt。

+0

你可以實現WM_QueryEndSession並調用Application.Terminate – whosrdaddy

+0

當Windows告訴它時爲什麼不關閉你的程序? –

+0

@大衛:那正是我想要發現的! – frogb

回答

1

在失敗的最終狀態下,程序重新連接了FormCloseQuery方法,但在每個方法中,它現在檢查'shuttingdown'全局布爾值,並在設置此值時允許關閉。在主窗體上的WM_QUERYENDSESSION消息處理程序中,Shutdowndown設置爲true。這適用於單一形式的應用程序。

該問題是由主窗體以外的FormCloseQuery處理程序在主窗體上的WM_QUERYENDSESSION消息處理程序之前全部調用所致。我已經在我做過的各種編輯和測試中錯過了這個事實。

如果您的應用程序具有任何具有FormCloseQuery處理程序的子窗體,如果它在隨機時刻被調用,結果可能是「不關閉」(例如,在結束會話時,當表單可能未被初始化),那麼你需要一個WM_QUERYENDSESSION消息處理程序,其格式爲。這可以設置一個窗體或局部變量來使FormCloseQuery將canclose設置爲true。

+0

我有一個類似的情況。輔助表單的OnFormCloseQuery阻止了整個應用程序的關閉。值得注意的是,這個表單是在運行時創建的,但從未顯示過。所以缺陷並不明顯,因爲關閉查詢將針對每個現有表單執行,而不僅僅針對那些顯示。在我的情況下,一個不恰當的初始化變量是罪魁禍首。 –

相關問題