首先要了解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;

解决方案 »

  1.   

    luoweicaisd(笑三少):
        该应用程序能自动运行?一旦关机就执行删除文件操作,而不用运行该应用程序
      

  2.   

    致luoweicaisd(笑三少):
       procedure TForm1.winexit
            (var Msg: TMessage);
          begin
              showmessage('123');
     self.close;//关闭我的程序
              Msg.Result := 1;//允许系统关机
              // Msg.Result := 0;禁止用户关闭WIN9X
           end;也就是关机时showmessage()不能显示出来
      

  3.   

    procedure TForm1.winexit
            (var Msg: TMessage);
          begin
    Msg.Result := 0;  //<---------------------------
              showmessage('123');
     self.close;//关闭我的程序
              Msg.Result := 1;//允许系统关机
              // Msg.Result := 0;禁止用户关闭WIN9X
           end;
      

  4.   

    procedure WMQUERYENDSESSION(var message:Tmessage);message WM_QUERYENDSESSION;
    可以截获系统关闭时的消息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;
      

  5.   

    现在消息已经拦截到了,现在要解决的问题是:我编译成功的.exe文件如何能够在关机时自动运行呢?
      

  6.   

    如何在关机时去自动运行.exe?
      

  7.   

    把你的程序做一个服务就可以啦,不过win9x可能不一行。
      

  8.   

    做个监听程序,拦截WM_QUERYENDSESSION事件,
    用winexec调用你的程序.
    监听程序让他系统启动的时候就启动.