各位大侠,为何WM_QUERYENDSESSION消息不能用 我翻阅了一些参考资料,都说关机的消息是:WM_QUERYENDSESSION可以才能在程序里捕获到WM_QUERYENDSESSION消息谢谢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我在程序里用到了托盘图标,但是没有在CloseQuery和Close里面写不让退出程序的代码。 outer2000(天外流星) :是的,如果能够捕获关机的消息,我就能够退出了,不过我还是希望能有更好的办法! 当执行exitwindows函数时它会发送一个WM_QUERYENDSESSION消息给所有正在运行的程序。 你当然可以捕捉到了,你用到什么VCL了,都?导致现在的问题? 我仅仅用了一个Shell_NotifyIcon函数用来添加一个托盘图标,还有,我确实不能捕捉到那个该死的消息。 我是在WndProc过程里捕获消息的声明:procedure WndProc(var Msg: TMessage);override;调用if Msg.Msg=WM_QUERYENDSESSION then myMessageBox('QUIT'); outer2000(天外流星) ( ) 信誉:101 那么应该怎么做才好呢? 下面是我的主要代码: 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 caseend; D7, 真的不能显示平方米 ㎡ ? 数据查询 stringGrid闪烁的问题 软件注册功能 我的delphi5怎么说undeclared indentifier: 'TCompressStream'??? 求《Delphi X Developer's Guide》电子,100分 DELPHI里面有没有快闪窗口 一个关于接口的问题,一定给分!!! API的函数使用?烦请专家看看!!! 一个very easy的problem 设置DateSeparator的问题 征集源码例子(二)
是的,如果能够捕获关机的消息,我就能够退出了,不过我还是希望能有更好的办法!
它会发送一个WM_QUERYENDSESSION消息给所有正在运行的程序。
声明:
procedure WndProc(var Msg: TMessage);override;调用
if Msg.Msg=WM_QUERYENDSESSION then myMessageBox('QUIT');
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;