首先要了解Windows的关机的程序。当用户退出Windows时,Windows系统会给每个Top-level的窗体发WM_QUERYENDSESSION 的系统消息,查询能否关机,窗体可在接到此消息时进行结束前的工作(如编辑类的窗体会提示未保存的文件存盘等),窗体返回TRUE为同意关机,FALSE为不同意关机。
Windows9x等所有的窗体都回应了WM_QUERYENDSESSION后,系统会再发WM_ENDSESSION的消息,消息的wparam 参数为是否结束Windows,若TRUE,窗体要马上结束程序,若FALSE则取消关闭Windows的命令,窗体可以照常工作。只要某一窗体在WM_QUERYENDSESSION返回FALSE(不同意关机),WM_ENDSESSION的wparam即为FALSE。而在Windows NT/2000窗体返回WM_QUERYENDSESSION后马上接到WM_ENDSESSION的消息,不用等其它窗体对WM_QUERYENDSESSION的回应。不管在9x、Nt和2000,各Top-level的窗体都可以“一票否决”取消关闭Windows的命令,这样可以确保应用程序的数据不会丢失。自己的程序可以捕捉上述的两个消息.1. 捕捉windows的关机消息
private
procedure winexit(var msg:Tmessage);message WM_QUERYENDSESSION;
...
procedure TForm1.winexit(var msg: Tmessage);
begin
{your code here}
end;
Windows9x等所有的窗体都回应了WM_QUERYENDSESSION后,系统会再发WM_ENDSESSION的消息,消息的wparam 参数为是否结束Windows,若TRUE,窗体要马上结束程序,若FALSE则取消关闭Windows的命令,窗体可以照常工作。只要某一窗体在WM_QUERYENDSESSION返回FALSE(不同意关机),WM_ENDSESSION的wparam即为FALSE。而在Windows NT/2000窗体返回WM_QUERYENDSESSION后马上接到WM_ENDSESSION的消息,不用等其它窗体对WM_QUERYENDSESSION的回应。不管在9x、Nt和2000,各Top-level的窗体都可以“一票否决”取消关闭Windows的命令,这样可以确保应用程序的数据不会丢失。自己的程序可以捕捉上述的两个消息.1. 捕捉windows的关机消息
private
procedure winexit(var msg:Tmessage);message WM_QUERYENDSESSION;
...
procedure TForm1.winexit(var msg: Tmessage);
begin
{your code here}
end;
解决方案 »
- 服务程序调用WebService接口报错
- 高分求助,SHGetfileinfo 出错问题。
- 在輸入法imeMode中,imDisable模式是什麼意思?
- 我想将窗体生成成dll,然后在exe中调用这个dll,请问怎样实现。
- 不用控件,纯API画了一个WS_GROUPBOX风格的窗口之后。。。
- 刚结完了所有的贴,心情不错,散分!!
- 在安装delphi8的时候,总提示让我安装microsoft frame sdk等等,请问从哪里下载啊?
- 50分索求一个IP地址编辑控件,请大家帮我。
- Delphi调用C++ DLL疑问
- 谁了解MIND是啥?是个传播学概念吗?
- BDE字符集的问题。
- 请问在delphi中如何将表中重复记录删除???
该应用程序能自动运行?一旦关机就执行删除文件操作,而不用运行该应用程序
procedure TForm1.winexit
(var Msg: TMessage);
begin
showmessage('123');
self.close;//关闭我的程序
Msg.Result := 1;//允许系统关机
// Msg.Result := 0;禁止用户关闭WIN9X
end;也就是关机时showmessage()不能显示出来
(var Msg: TMessage);
begin
Msg.Result := 0; //<---------------------------
showmessage('123');
self.close;//关闭我的程序
Msg.Result := 1;//允许系统关机
// Msg.Result := 0;禁止用户关闭WIN9X
end;
可以截获系统关闭时的消息message.lparam代表关机的类型,具体是什么我不清楚,你可以分别用关机,重启,注销来检测其值!
我刚试了一下,关机和重启都是0,注销是-2147483648(如果检测lparamhi则为32768)
(d5+winme)
下面是我的测试代码:
TForm1 = class(TForm)
private
procedure WMQUERYENDSESSION(var msg:Tmessage);message WM_QUERYENDSESSION;
{ Private declarations }
public
{ Public declarations }
end;procedure tform1.WMQUERYENDSESSION(var msg:Tmessage);
begin
showmessage(inttostr(msg.lparamlo)+chr(13)+chr(10)+inttostr(msg.lparamhi));
msg.Result :=0;
end;
用winexec调用你的程序.
监听程序让他系统启动的时候就启动.