gpt4 book ai didi

delphi - 检测 Windows 关闭或应用程序是否尝试从系统菜单关闭 (WM_CLOSE)

转载 作者:行者123 更新时间:2023-12-03 14:39:34 25 4
gpt4 key购买 nike

我正在使用 Tray 应用程序。

Onj FormCloseQuery 我检查程序是否应该转到托盘,而不是关闭它,而是将其放入托盘中(CanClose := False)

但是,如果 Windows 由于 Windows 关闭而尝试关闭我的应用程序,我不想将我的应用程序移至托盘中,而是将其关闭。

Win7 终止我的应用程序,但 XP 不会关闭,因为我的应用程序仍保留在托盘中。

如何检测 Windows 是否处于某种“关闭”模式?

谢谢!

最佳答案

如果响应 WM_QUERYENDSESSION 消息而触发 OnCloseQuery 事件,设置 CanClose=False 将导致消息返回

在 XP 及更早版本中,这将取消 Windows 关闭。到目前为止,任何已收到 WM_QUERYENDSESSION 消息的应用都将收到 WM_ENDSESSION 消息,其 wParam 值设置为 FALSE 告诉这些应用不要自行终止。这就是为什么您的应用程序会进入托盘并且在 Windows 关闭期间不会退出。

Microsoft 在 Windows Vista 中更改了此行为,因此应用程序无法再通过 WM_QUERYENDSESSION 取消 Windows 关闭。这就是 Windows Vista 及更高版本将终止您的应用程序的原因。如果应用程序需要故意停止 Windows 关闭,则会引入一个全新的 API。

这在 MSDN 上有记录:

Application Shutdown Changes in 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;

关于delphi - 检测 Windows 关闭或应用程序是否尝试从系统菜单关闭 (WM_CLOSE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10745151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com