久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Delphi 消息之?dāng)r截篇---攔截系統(tǒng)關(guān)機(jī)、重啟,、注銷(xiāo)

 quasiceo 2013-03-14

Delphi 消息之?dāng)r截篇---攔截系統(tǒng)關(guān)機(jī)、重啟、注銷(xiāo)

  最近做的項(xiàng)目中需要攔截系統(tǒng)關(guān)機(jī),因?yàn)槲以贔ormCloseQuery中總是把CanClose設(shè)為False,,不攔截關(guān)機(jī)的話直接導(dǎo)致系統(tǒng)中的關(guān)機(jī)、重啟,、注銷(xiāo)都失效了,!導(dǎo)致用戶不能關(guān)機(jī)!(提示用戶說(shuō)要關(guān)機(jī)的話直接按電源^^)這樣肯定是不行的,!

要完成這個(gè)功能只需要攔截到WM_QUERYENDSESSION消息就萬(wàn)事Ok!

  Windows在關(guān)機(jī)的時(shí)候會(huì)想(向)所有頂層窗口廣播一個(gè)消息WM_QUERYENDSESSION,,其lParam參數(shù)可以區(qū)分是關(guān)機(jī)還是注銷(xiāo)用戶(注銷(xiāo)用 戶時(shí)lParam是ENDSESSION_LOGOFF)。然后Windows會(huì)等到所有的應(yīng)用程序都對(duì)這個(gè)消息返回TRUE才會(huì)關(guān)機(jī),,因此,,只要我們的 應(yīng)用程序?qū)@個(gè)消息的處理返回FALSE,Windows就不會(huì)關(guān)機(jī)了,。

  這個(gè)消息不能直接讓?xiě)?yīng)用程序退出,,這個(gè)消息主要是詢問(wèn)應(yīng)用程序是否已經(jīng)作好了退出的準(zhǔn)備,當(dāng)所有的應(yīng)用程序都對(duì)這個(gè)消息返回TRUE,系統(tǒng)回(會(huì))注銷(xiāo)或關(guān)機(jī),。如果想退出程序,,請(qǐng)使用WM_CLOSE消息!

關(guān)鍵在于怎么在Delphi下攔截WM_QUERYENDSESSION消息呢,?Delphi也是很強(qiáng)悍的,,當(dāng)然不用直接去SetWindowLong了。

  首先介紹一下Delphi中攔截消息的幾種做法

第一種:自定義處理單條消息

  1. unit Unit2;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs;  
  8.   
  9. type  
  10.   TForm2 = class(TForm)  
  11.     procedure FormCreate(Sender: TObject);  
  12.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);  
  13.   private  
  14.     { Private declarations }  
  15.     //直接用 TWMQueryEndSession  
  16.     procedure EndMsg(var nMsg: TWMQueryEndSession); Message WM_QUERYENDSESSION;  
  17.     //也可以用這種  
  18.     //procedure EndMsg(var nMsg: TMessage); Message WM_QUERYENDSESSION;  
  19.   public  
  20.     { Public declarations }  
  21.   end;  
  22.   
  23. var  
  24.   Form2: TForm2;  
  25.   
  26. implementation  
  27.   
  28. {$R *.dfm}  
  29.   
  30. //收到WM_QUERYENDSESSION消息后就會(huì)觸發(fā)這個(gè)過(guò)程  
  31. procedure TForm2.EndMsg(var nMsg: TWMQueryEndSession);  
  32. begin  
  33.   //0 可以取消關(guān)機(jī)操作  
  34.   nMsg.Result := 1;  
  35.   ShowMessage('注銷(xiāo),、重啟,、關(guān)機(jī)');  
  36. end;  
  37.   
  38. end.  

第二種:利用Application.OnMessage處理消息

  1. unit Unit2;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs;  
  8.   
  9. type  
  10.   TForm2 = class(TForm)  
  11.     procedure FormCreate(Sender: TObject);  
  12.   private  
  13.     { Private declarations }  
  14.   
  15.   public  
  16.     { Public declarations }  
  17.     procedure OnMsg(var nMsg: tagMSG; var nHandled: Boolean);  
  18.   end;  
  19.   
  20. var  
  21.   Form2: TForm2;  
  22.   
  23. implementation  
  24.   
  25. {$R *.dfm}  
  26.   
  27. //消息處理過(guò)程  
  28. procedure TForm2.OnMsg(var nMsg: tagMSG; var nHandled: Boolean);  
  29. begin  
  30.   //處理……  
  31.   //這里會(huì)收到各種消息……經(jīng)測(cè)試無(wú)法收到WM_QUERYENDSESSION消息  
  32. end;  
  33.   
  34. procedure TForm2.FormCreate(Sender: TObject);  
  35. begin  
  36.   Application.OnMessage := OnMsg;  
  37. end;  
  38.   
  39. end.  

第三種:自己處理窗口函數(shù),個(gè)人感覺(jué)這是最強(qiáng)大的,,可以攔截一切發(fā)往窗口的消息,!

  1. unit Unit2;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs;  
  8.   
  9. type  
  10.   TForm2 = class(TForm)  
  11.     procedure FormCreate(Sender: TObject);  
  12.   private  
  13.     { Private declarations }  
  14.   
  15.   public  
  16.     { Public declarations }  
  17.     procedure WndProc(var nMsg: TMessage); override;  
  18.   end;  
  19.   
  20. var  
  21.   Form2: TForm2;  
  22.   
  23. implementation  
  24.   
  25. {$R *.dfm}  
  26.   
  27. procedure TForm2.WndProc(var nMsg: TMessage);  
  28. begin  
  29.   
  30.   //這里能收到發(fā)往窗口的所有消息  
  31.   
  32.   inherited// 注意這句不能少  
  33.   
  34.   if nMsg.Msg = WM_QUERYENDSESSION then  
  35.   begin  
  36.     if nMsg.LParam = 0 then  
  37.       ShowMessage('關(guān)機(jī)或重啟')  
  38.     else  
  39.       ShowMessage('注銷(xiāo)');  
  40.   end;  
  41.   
  42. end;  
  43.   
  44. end.  

經(jīng)過(guò)再次測(cè)試,只有Application.OnMessage不能攔截WM_QUERYENDSESSION消息,!還有,,有時(shí)候Delphi的一些控件也會(huì)導(dǎo)致不能正確攔截。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多