我翻阅了一些参考资料,都说关机的消息是:WM_QUERYENDSESSION
可以才能在程序里捕获到WM_QUERYENDSESSION消息谢谢了!

解决方案 »

  1.   

    我在程序里用到了托盘图标,但是没有在CloseQuery和Close里面写不让退出程序的代码。
      

  2.   

    outer2000(天外流星) :
    是的,如果能够捕获关机的消息,我就能够退出了,不过我还是希望能有更好的办法!
      

  3.   

    当执行exitwindows函数时
    它会发送一个WM_QUERYENDSESSION消息给所有正在运行的程序。
      

  4.   

    你当然可以捕捉到了,你用到什么VCL了,都?导致现在的问题?
      

  5.   

    我仅仅用了一个Shell_NotifyIcon函数用来添加一个托盘图标,还有,我确实不能捕捉到那个该死的消息。
      

  6.   

    我是在WndProc过程里捕获消息的
    声明:
    procedure WndProc(var Msg: TMessage);override;调用
    if Msg.Msg=WM_QUERYENDSESSION then myMessageBox('QUIT');
      

  7.   

    outer2000(天外流星) ( ) 信誉:101 那么应该怎么做才好呢?
      

  8.   

    下面是我的主要代码:  private
        FIconTray       :TIcon;             // 托盘图标
        FAppIcon        :boolean;           // 图标变换
        procedure TrayShow(Sender: TObject);
        procedure WMMyTrayIconCallBack(var Msg : TMessage); //处理点击托盘图标的事件
          message WM_MYTRAYICONCALLBACK;
      end;procedure TfrmMain.FormCreate(Sender: TObject);
    begin
        // 建立热键
        FHotKey:=TMyHotKey.Create(self);
        FIconTray:=TIcon.Create;
        FAppIcon:=true;
        TrayShow(Application.MainForm);//显示图标
        // 不在任务栏显示主窗体
        //SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
    end;procedure TfrmMain.TrayShow(Sender: TObject);
    //当点击托盘图标时显示或隐含主窗体
    begin
        TrayBarPopMenu.AutoPopup:=False;
        //设定 TNotifyIconData 的记录长度
        MyTrayIcon.cbSize :=SizeOf(tnotifyicondata);
        //确定调用程序的窗体句柄
        MyTrayIcon.Wnd :=Handle;
        //确定图标的 uID
        MyTrayIcon.uID :=1;
        //设定显示标记
        MyTrayIcon.uFlags :=NIF_ICON or NIF_TIP or NIF_MESSAGE;
        //用户自定义消息
        MyTrayIcon.uCallbackMessage := WM_MYTRAYICONCALLBACK;
        //托盘图标的句柄
        MyTrayIcon.hIcon := Application.Icon.Handle;
        //托盘图标的提示信息
        MyTrayIcon.szTip :=PROGRAM_VER;
        //向托盘中添加图标
        Shell_NotifyIcon(NIM_ADD,@MyTrayIcon);
    end;procedure TfrmMain.WMMyTrayIconCallBack(var Msg: TMessage);
    //处理点击托盘图标的事件,根据 WM_MOUSEMOVE 消息的不同情况产生不同的回应
    var
        CursorPos : TPoint;
    begin
        TrayBarPopMenu.AutoPopup:=False;
        case Msg.lParam of
        //左键按下
        WM_LBUTTONDOWN :
        begin
            if not Application.MainForm.Visible then
            begin
                Application.MainForm.BringToFront;  //窗体置前
                Application.MainForm.SetFocus;
            end;
        end;
        //左键双击
        WM_LBUTTONDBLCLK :
        begin                                //窗体隐含或显示
            if cpDefPro.GetLogCount>0 then begin
                frmShowMsg.ShowMe;
            end
            else begin
                if Application.MainForm.Visible then Application.MainForm.Hide
                else
                begin
                    Application.MainForm.Show;
                    Application.MainForm.SetFocus;
                end;
                SetForegroundWindow(Application.Handle);
            end;
        end;
        //右键按下
        WM_RBUTTONDOWN :
        begin                                //显示弹出菜单
            GetCursorPos(CursorPos);
            TrayBarPopMenu.Popup(CursorPos.x,CursorPos.y);
        end;
        else    end;//end case
    end;