關於 OnCloseQuery: 順序、不能關機等

系統關閉窗體的事件順序爲:

  OnCloseQuery ----> OnClose ----> OnDestroy

下面的代碼說明問題:

 

另外 從網友 http://echocancer.spaces.live.com/blog/cns!97776b41bf0a7f5d!141.entry 出摘的 文章:

 

程序不能關機?看看你在OnCloseQuery裏是不是寫了代碼!

今天終於解決了程序不能關機的問題,都是OnCloseQuery惹得禍!
程序裏有多個窗體,其中有兩個在OnCloseQuery裏寫了處理代碼,導致程序不能關機。
一開始我安網上找到的辦法試圖在主窗口中截獲WM_QUERYENDSESSION消息然後返回Msg.Result=1。發現這個消息根本就沒有傳到主窗口來,後來我又懷疑是不是Application.OnMessage把這個消息給攔截掉了,後來發現也不是的。最後才弄清楚如果一個窗體的OnCloseQuery事件中如果寫了代碼那麼WM_QUERYENDSESSION消息就傳不過去了msg.result會返回0,關機事件也就停止了。因爲程序中有兩個窗體的OncloseQuery中都寫了代碼所以WM_QUERYENDSESSION消息根本就傳不到主窗口。最後在那兩個窗口中攔截WM_QUERYENDSESSION消息,強制將msg.result返回1就解決了問題。
 
這次的問題讓我對windows的消息機制又有了更深的瞭解,所有的windows的廣播消息都是逐窗口傳遞的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章