• delphi处理消息的几种方式


    第一种:自定义处理单条消息

    [delphi] view plaincopy
     
    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消息后就会触发这个过程  
    31. procedure TForm2.EndMsg(var nMsg: TWMQueryEndSession);  
    32. begin  
    33.   //0 可以取消关机操作  
    34.   nMsg.Result := 1;  
    35.   ShowMessage('注销、重启、关机');  
    36. end;  
    37.   
    38. end.  

    第二种:利用Application.OnMessage处理消息

    [delphi] view plaincopy
     
    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. //消息处理过程  
    28. procedure TForm2.OnMsg(var nMsg: tagMSG; var nHandled: Boolean);  
    29. begin  
    30.   //处理……  
    31.   //这里会收到各种消息……经测试无法收到WM_QUERYENDSESSION消息  
    32. end;  
    33.   
    34. procedure TForm2.FormCreate(Sender: TObject);  
    35. begin  
    36.   Application.OnMessage := OnMsg;  
    37. end;  
    38.   
    39. end.  

    第三种:自己处理窗口函数,个人感觉这是最强大的,可以拦截一切发往窗口的消息!

    [delphi] view plaincopy
     
    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.   //这里能收到发往窗口的所有消息  
    31.   
    32.   inherited; // 注意这句不能少  
    33.   
    34.   if nMsg.Msg = WM_QUERYENDSESSION then  
    35.   begin  
    36.     if nMsg.LParam = then  
    37.       ShowMessage('关机或重启')  
    38.     else  
    39.       ShowMessage('注销');  
    40.   end;  
    41.   
    42. end;  
    43.   
    44. end.  
  • 相关阅读:
    Node js 入门指南(1)
    书单
    JavaScript
    Web框架的本质
    Linux运维面试(填空题)
    Ubuntu更换国内源
    动态路由-OSPF
    CentOS7安装桌面环境
    anaconda系统安装&kickstart文件
    Tomcat之分布式session共享(MSM)
  • 原文地址:https://www.cnblogs.com/chnxnghi/p/4164961.html
Copyright © 2020-2023  润新知