您的位置:首页 > 编程语言 > Delphi

Delphi 消息拦截篇 -- 之拦截系统关机、重启、注销

2011-04-05 00:47 471 查看
最近做的项目中需要拦截系统关机,因为我在FormCloseQuery中总是把CanClose设为False,不拦截关机的话直接导致系统中的关机、重启、注销都失效了!导致用户不能关机!(提示用户说要关机的话直接按电源^^)这样肯定是不行的!

要完成这个功能只需要拦截到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点了啊!睡觉去,明天争取把项目全部完成!加油!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: