Delphi 消息拦截篇 -- 之拦截系统关机、重启、注销
2011-04-05 00:47
471 查看
最近做的项目中需要拦截系统关机,因为我在FormCloseQuery中总是把CanClose设为False,不拦截关机的话直接导致系统中的关机、重启、注销都失效了!导致用户不能关机!(提示用户说要关机的话直接按电源^^)这样肯定是不行的!
要完成这个功能只需要拦截到WM_QUERYENDSESSION消息就万事Ok!
关键在于怎么在Delphi下拦截WM_QUERYENDSESSION消息呢?Delphi也是很强悍的,当然不用直接去SetWindowLong了。
好了不废话了,博客的第一篇文章就开始啦!
首先介绍一下Delphi中拦截消息的几种做法
第一种:自定义处理单条消息
第二种:利用Application.OnMessage处理消息
第三种:自己处理窗口函数,个人感觉这是最强大的,可以拦截一切发往窗口的消息!
经过再次测试,只有Application.OnMessage不能拦截WM_QUERYENDSESSION消息!还有,有时候Delphi的一些控件也会导致不能正确拦截,今天测试了一晚上了。。--|,总算解决了这个问题!!
好了,本文到此结束。由于在做这个功能的时候遇到了一些低级问题^^,所以马上在博客上记录一下,2点了啊!睡觉去,明天争取把项目全部完成!加油!!!
要完成这个功能只需要拦截到WM_QUERYENDSESSION消息就万事Ok!
关键在于怎么在Delphi下拦截WM_QUERYENDSESSION消息呢?Delphi也是很强悍的,当然不用直接去SetWindowLong了。
好了不废话了,博客的第一篇文章就开始啦!
首先介绍一下Delphi中拦截消息的几种做法
第一种:自定义处理单条消息
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm2 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private { Private declarations } //直接用 TWMQueryEndSession procedure EndMsg(var nMsg: TWMQueryEndSession); Message WM_QUERYENDSESSION; //也可以用这种 //procedure EndMsg(var nMsg: TMessage); Message WM_QUERYENDSESSION; public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} //收到WM_QUERYENDSESSION消息后就会触发这个过程 procedure TForm2.EndMsg(var nMsg: TWMQueryEndSession); begin //0 可以取消关机操作 nMsg.Result := 1; ShowMessage('注销、重启、关机'); end; end.
第二种:利用Application.OnMessage处理消息
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm2 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure OnMsg(var nMsg: tagMSG; var nHandled: Boolean); end; var Form2: TForm2; implementation {$R *.dfm} //消息处理过程 procedure TForm2.OnMsg(var nMsg: tagMSG; var nHandled: Boolean); begin //处理…… //这里会收到各种消息……经测试无法收到WM_QUERYENDSESSION消息 end; procedure TForm2.FormCreate(Sender: TObject); begin Application.OnMessage := OnMsg; end; end.
第三种:自己处理窗口函数,个人感觉这是最强大的,可以拦截一切发往窗口的消息!
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm2 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure WndProc(var nMsg: TMessage); override; end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.WndProc(var nMsg: TMessage); begin //这里能收到发往窗口的所有消息 inherited; // 注意这句不能少 if nMsg.Msg = WM_QUERYENDSESSION then begin if nMsg.LParam = 0 then ShowMessage('关机或重启') else ShowMessage('注销'); end; end; end.
经过再次测试,只有Application.OnMessage不能拦截WM_QUERYENDSESSION消息!还有,有时候Delphi的一些控件也会导致不能正确拦截,今天测试了一晚上了。。--|,总算解决了这个问题!!
好了,本文到此结束。由于在做这个功能的时候遇到了一些低级问题^^,所以马上在博客上记录一下,2点了啊!睡觉去,明天争取把项目全部完成!加油!!!
相关文章推荐
- Delphi 消息拦截篇 -- 之拦截系统关机、重启、注销
- Delphi 消息之拦截篇---拦截系统关机、重启、注销
- DELPHI中调用API函数ExitWindowsEX可以实现系统的关机,注销,和重启
- Windows 系统关机、重启、睡眠、休眠及唤醒消息
- MFC中应用WM_ENDSESSION,WM_QUERYENDSESSION消息截获系统的关机/注销
- 再谈Delphi关机消息拦截 -- 之控制台程序 SetConsoleCtrlHandler(控制台使用回调函数拦截,比较有意思)
- 再谈Delphi关机消息拦截 -- 之控制台程序 SetConsoleCtrlHandler
- MFC 响应windows系统睡眠/休眠和重启/关机/注销的消息
- C# 实现系统关机、注销、重启、休眠、挂起
- linux 系统关机 重启与注销命令
- 简单实现windows系统普通或强制关机重启注销的功能
- linux基础命令学习(一)系统的关机、重启以及注销
- C#实现控制Windows系统关机、重启和注销的方法
- XP系统中关机、注销、重启功能
- 如何用VC实现系统关机、重启、注销
- C# 实现系统关机、注销、重启、休眠、挂起
- 关机、注销、登录、锁屏、资源管理器重启等消息
- C#实现系统关机、重启、注销等操作
- C#实现控制Windows系统关机、重启和注销的方法:
- C# 实现系统关机、注销、重启、休眠、挂起