我有个程序缩小到托盘后系统就无法关机了。
程序中使用了SOCKETConnetion。
程序缩小到托盘后无法拦截到系统的关机消息,窗口激活时能拦截到,经过处理程序能关闭但还是不能关闭系统。
有人能帮助我吗?

解决方案 »

  1.   

    截获WM_QUERYENDSESSION消息,并返回1
      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
      msg.Result :=1;
    end;
      

  2.   

    终于找到了:
    var willcolse:boolean;//授权“关闭”变量,你可以保存到INI文件或注册表中。procedure mymessage(var Message: TWMSysCommand);message WM_SYSCOMMAND;procedure TForm1.mymessage(var Message: TWMSysCommand);
    begin
      if (Message.CmdType and $FFF0 = SC_CLOSE) then
         if willcolse then Inherited
         else Application.Minimize
      else Inherited;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      willcolse:=true;//授权“关”
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      willcolse:=false;////授权“不关”
    end;
      

  3.   

    楼主看看这个, 我从网上找到的. 现在我的机器没有delphi^_^  一、问题的提出:运行某任务的计算机,尤其是服务器,如果能实现在无人职守的情况下,到达指定时间时自动关机,那么将极大地减轻系统管理员的负担,也会给我们的日常工作带来很大方便。   笔者用Delphi开发的这个定时自动关机程序,适用于目前两类的Windows系列操作系统:从Windows 95/98/Me到Windows NT/2000/XP。   二、程序的功能有:   1.用户自己设定关机时间,通过自定义函数IsValidTime()判断用户输入的时间是否有效。   2.定时强制自动关机:对于windows 95/98/Me,直接调用API函数ExitWindowsEx()关机。对于NT/2000/XP,需要取得计算机名,获得关机特权后,才能关机:首先调用OpenProcessToken()函数得到存取令牌的句柄,然后调用AdjustTokenPrivileges()函数来使能该特权。Win32API定义了一组字符串常量来标识不同的特权,如关机特权是 ’SeShutdownPrivilege’。   3.到达设定的关机时间时,延时30秒,以便用户保存文件,或取消关机。两类操作系统都显示倒记时,对于windows 95/98/Me,只通过程序界面显示;对于NT/2000/XP,将调用系统的倒记时界面显示。   4.为了不占用任务栏的空间,程序显示在托盘中。右键单击托盘中的图标,将显示快捷菜单。   5.如果未到设定的关机时间,系统要关闭,该程序能截获关机消息,由用户选择是否关机。原理是:当用户关闭Windows时,系统会发送给各应用程序一个消息wm_queryendsession,告诉各应用程序要关机了,如果反馈回来的消息值为0,就不能关机。因此,截获wm_queryendsession,并反馈回0,就大功告成了。   6.在内存中只运行本程序的一个实例。原理是:利用Windows 的全局原子表信息来实现此功能。Windows 的全局原子表可以被当前所有应用程序访问,它一共可包含37 项内容。程序运行时,首先检查在表中有无本程序的信息,如有,则提示后退出。如没有,则在表中增加该程序的信息。程序最后退出时要从表中移走信息以便程序能再运行。     四、源程序: unit AutoShut1; 
    interface uses 
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
      Dialogs, StdCtrls, ExtCtrls, Menus,AppEvnts,shellapi; 
    type 
      TForm1 = class(TForm) 
      Timer1: TTimer; 
      Timer2: TTimer; 
      ApplicationEvents1: TApplicationEvents; 
      PopupMenu1: TPopupMenu; 
      Edit1: TEdit; 
      Edit2: TEdit; 
      Label1: TLabel; 
      Label2: TLabel; 
      Label3: TLabel; 
      Btn_OK: TButton; 
      Btn_Abort: TButton; 
      procedure Timer1Timer(Sender: TObject); 
      procedure TrayMenu(Var Msg:TMessage); message WM_USER; 
      procedure TimeSetClick(Sender: TObject); 
      procedure ExitClick(Sender: TObject); 
      procedure Btn_OKClick(Sender: TObject); 
      procedure Btn_AbortClick(Sender: TObject); 
      procedure Timer2Timer(Sender: TObject); 
      procedure Edit2KeyPress(Sender: TObject; var Key: Char); 
      procedure WMQueryEndSession (var Msg : TWMQueryEndSession); 
      message WM_QueryEndSession; 
      procedure FormCreate(Sender: TObject); 
      procedure FormDestroy(Sender: TObject); 
      procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
    private 
     { Private declarations } 
     Tray:NOTIFYICONDATA; 
     procedure ShowInTray(); 
    public 
     { Public declarations } 
    end; var 
      Form1: TForm1; 
      P,Ti1:Pchar; 
      Flags:Longint; 
      i:integer; 
      {关机延迟时间} 
      TimeDelay:integer; 
      atom:integer; 
      implementation 
     {$R *.dfm}