Wolfgang Chien's Homepage | Delphi學習筆記 - 問答篇 |
大家好
小弟最近在研究一個問題 但一直沒進展 我知到當使用者按下關閉win95時, 系統會send 一個message 到各個Application 如下:wm_queryendsession, 於是我在程式中加入
procedure canclose(var message:Tmessage);message wm_queryendsession;
但是實在不知該如何回傳給windows 我用message.wparam:=0 回傳給windows ,一來 windows就不會關閉了, 但是要如何告訴windows可以關機了 有經驗的大哥 煩請幫小弟個忙
Hi!
不是改短參數啦! TMessage 這個資料結構中有一個 Result 欄位, 其他程式SendMessage()到我們程式後所得到的傳回值是在 Result中指定的. 根據 Win32 SDK Help 的說明, 只要其中任一個應用程式對 wm_QueryEndSession 反應傳回 0, 那系統就停止發送此一訊息, 同時整個系統也就不會關閉了.
這個訊息我之前也沒有攔過, 是不是有其他使用上的注意事項, 並不清楚, 不過看了資料後, 以下這個實驗的例子倒是如預期的, 請您參考看看. (Delphi 2)
![]() |
1. File | New Application |
![]() |
2. 在 Form1 上放置一個 TCheckBox, 並將其 Caption 設為 '允許 Windows 95 關閉' |
![]() |
3. 在 Interface 與 Implementation 中分別作訊息處理程序的宣告與實作,
改好後的程式會像是這樣:.
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) CheckBox1: TCheckBox; private { Private declarations } procedure WMQueryEndSession(var Msg: TMessage); message WM_QueryEndSession; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMQueryEndSession(var Msg: TMessage); begin if CheckBox1.Checked then Msg.Result := 1 else Msg.Result := 0; end; end. |
![]() |
4. 專案存檔, 執行, 請注意, 這次執行只是要產生 EXE 執行檔並確定沒有語法錯誤而已. |
![]() |
5. 結束Delphi 2 後, 開一個捷徑或者'開始|執行'剛才產生的執行檔. |
![]() |
6. ok, 如果畫面中的 CheckBox 核取了,那 '開始|關機' 才會結束 Windows 95. |
首頁 | 學習筆記 | 主題公園 | 軟體下載 | 關於本站 | 討論信群 | 相約下次 |