我在托盘中的应用。
颌骨坏死FormCloseQuery我是否应该程序转到托盘,而不是关闭它,我把它放在托盘(CanClose:= FALSE)
但是,如果Windows尝试关闭,因为Windows关机的我的应用程序要不要动我的应用程序装入盘内,但将其关闭。
Win7的终止我的应用程序,但XP不关闭,因为我的应用程序保持在托盘。
我如何检测Windows是否是一些“关闭”模式或不?
谢谢!
我在托盘中的应用。
颌骨坏死FormCloseQuery我是否应该程序转到托盘,而不是关闭它,我把它放在托盘(CanClose:= FALSE)
但是,如果Windows尝试关闭,因为Windows关机的我的应用程序要不要动我的应用程序装入盘内,但将其关闭。
Win7的终止我的应用程序,但XP不关闭,因为我的应用程序保持在托盘。
我如何检测Windows是否是一些“关闭”模式或不?
谢谢!
你的问题是因为使用的干OnCloseQuery
这是使用了错误的事件。 雷米的回答解释了如何要解决的妨碍而默认VCL结束会话消息处理Windows关机。 而这又是通过设置导致CanClose
以False
的OnCloseQuery
事件。
这变通办法将完成这项工作,但有一个更简单的处理这种方式。 相反,从停止收盘形式,让它继续和关闭。 删除您OnCloseQuery
干脆事件。 与替换它OnClose
事件。
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caNone;
Visible := False;
end;
这相当琐碎的码位是足以让你的应用程序最小化到托盘时,主窗体关闭。
如果OnCloseQuery
事件响应触发WM_QUERYENDSESSION
消息,设置CanClose=False
将导致消息返回FALSE
。
在XP和更早的版本,将取消Windows关机。 到这一点,那已经收到了任何应用程序WM_QUERYENDSESSION
邮件将得到WM_ENDSESSION
消息,其wParam
设置为值FALSE
告诉这些应用程序不终止自己。 这就是为什么你的应用程序进入到托盘和Windows关机过程中不会退出。
微软在Windows Vista中改变了这种行为,以便应用程序无法取消通过Windows关机WM_QUERYENDSESSION
了。 这就是为什么Windows Vista和更高将终止您的应用程序。 还有如果一个应用程序需要在目标停止Windows关机推出了全新的API。
这是记录在MSDN:
在Windows Vista中的应用程序关闭更改
要做到你的要求,你必须拦截WM_QUERYENDSESSION
直接邮件,以便确定是否OnCloseQuery
被称为由于Windows关机与否。 例如:
type
TForm1 = class(TForm)
private
procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
procedure WMEndSession(var Message: TWMEndSession); message WM_ENDSESSION;
end;
var
ShuttingDown: Boolean = False;
procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
ShuttingDown := True;
inherited;
end;
procedure TForm1.WMEndSession(var Message: TWMEndSession);
begin
ShuttingDown := Message.EndSession;
inherited;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := ShuttingDown;
if not ShuttingDown then
begin
// your Tray logic here ...
end;
end;