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

  1. unit Unit2;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs;
  6. type
  7. TForm2 = class(TForm)
  8. procedure FormCreate(Sender: TObject);
  9. procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  10. private
  11. { Private declarations }
  12. //直接用 TWMQueryEndSession
  13. procedure EndMsg(var nMsg: TWMQueryEndSession); Message WM_QUERYENDSESSION;
  14. //也可以用这种
  15. //procedure EndMsg(var nMsg: TMessage); Message WM_QUERYENDSESSION;
  16. public
  17. { Public declarations }
  18. end;
  19. var
  20. Form2: TForm2;
  21. implementation
  22. {$R *.dfm}
  23. //收到WM_QUERYENDSESSION消息后就会触发这个过程
  24. procedure TForm2.EndMsg(var nMsg: TWMQueryEndSession);
  25. begin
  26. //0 可以取消关机操作
  27. nMsg.Result := 1;
  28. ShowMessage('注销、重启、关机');
  29. end;
  30. end.

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

  1. unit Unit2;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs;
  6. type
  7. TForm2 = class(TForm)
  8. procedure FormCreate(Sender: TObject);
  9. private
  10. { Private declarations }
  11. public
  12. { Public declarations }
  13. procedure OnMsg(var nMsg: tagMSG; var nHandled: Boolean);
  14. end;
  15. var
  16. Form2: TForm2;
  17. implementation
  18. {$R *.dfm}
  19. //消息处理过程
  20. procedure TForm2.OnMsg(var nMsg: tagMSG; var nHandled: Boolean);
  21. begin
  22. //处理……
  23. //这里会收到各种消息……经测试无法收到WM_QUERYENDSESSION消息
  24. end;
  25. procedure TForm2.FormCreate(Sender: TObject);
  26. begin
  27. Application.OnMessage := OnMsg;
  28. end;
  29. end.

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

  1. unit Unit2;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs;
  6. type
  7. TForm2 = class(TForm)
  8. procedure FormCreate(Sender: TObject);
  9. private
  10. { Private declarations }
  11. public
  12. { Public declarations }
  13. procedure WndProc(var nMsg: TMessage); override;
  14. end;
  15. var
  16. Form2: TForm2;
  17. implementation
  18. {$R *.dfm}
  19. procedure TForm2.WndProc(var nMsg: TMessage);
  20. begin
  21. //这里能收到发往窗口的所有消息
  22. inherited; // 注意这句不能少
  23. if nMsg.Msg = WM_QUERYENDSESSION then
  24. begin
  25. if nMsg.LParam = 0 then
  26. ShowMessage('关机或重启')
  27. else
  28. ShowMessage('注销');
  29. end;
  30. end;
  31. end.

最新文章

  1. android ANR产生原因和解决办法
  2. Linux的文件时间
  3. 排序算法总结(四)快速排序【QUICK SORT】
  4. MVC采用HtmlHelper扩展和Filter封装验证码的功能
  5. android studio 自用快捷键方案
  6. UrlRewriteFilter 美化器的使用方法 伪静态化的解决方案(转)
  7. [学习笔记]设计模式之Proxy
  8. 所有语言的Awesome
  9. BZOJ 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐( dfs )
  10. Unity3D中使用MiniJson解析json的例子
  11. .net的retrofit--WebApiClient库深入篇
  12. webpack : 无法将“webpack”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
  13. 区间DP 洛谷P2858牛奶零食
  14. 20155219付颖卓《网络对抗》MSF基础应用实验
  15. PHP中的反射模拟框架中控制器的调度
  16. Win32 CMD批处理命令
  17. Mac 卸载 Jenkins
  18. pycharm运行pytest
  19. nginx 本地映射
  20. SQL Timeout超时的处理方法

热门文章

  1. 基于MAC OS 操作系统安装、配置mysql
  2. linux的Make使用的重定向
  3. 我的Java笔记
  4. 扩展jquery插件的方法
  5. Android jni 编程4(对基本类型二维整型数组的操作)
  6. Top 10 Books For Advanced Level Java Developers
  7. ionic接入广告
  8. 如何在shell脚本中导出数组供子进程使用
  9. ABP 学习汇总
  10. Java Calendar.set 方法设置时间的问题