【发布时间】:2017-02-09 23:13:51
【问题描述】:
我需要拦截 Windows 关闭,并执行一些数据库查询,然后我的应用程序将关闭。 我在 Windows 10 下在 FMX 项目中使用 Delphi XE10
我尝试的是下面的代码,但它不起作用
private
{ Private declarations }
{$IFDEF MSWINDOWS}
procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION;
procedure WMEndSession(var Msg : TWMQueryEndSession); message WM_ENDSESSION ;
{$ENDIF}
end;
procedure TfMain.WMQueryEndSession(var Msg: TWMQueryEndSession);
var
lista:TStringList;
begin
{$IFDEF MSWINDOWS}
try
lista:=TStringList.Create;
lista.Add(FOrmatDateTime('DD/MM/YYYY HH:NN:SS',now)+' event WMQueryEndSession');
Lista.SaveToFile(froot+formatdatetime('YYMMDDHHNNSSZZZ',now)+'.log');
SincroClose();
lista.Add(FOrmatDateTime('DD/MM/YYYY HH:NN:SS',now)+' Done');
Lista.SaveToFile(froot+formatdatetime('YYMMDDHHNNSSZZZ',now)+'.log');
finally
lista.Free;
end;
{$ENDIF}
inherited;
end;
procedure TfMain.WMEndSession(var Msg: TWMQueryEndSession);
var
lista:TStringList;
begin
{$IFDEF MSWINDOWS}
try
lista:=TStringList.Create;
lista.Add(FOrmatDateTime('DD/MM/YYYY HH:NN:SS',now)+' WMEndSession');
Lista.SaveToFile(froot+formatdatetime('YYMMDDHHNNSSZZZ',now)+'.log');
SincroClose();
lista.Add(FOrmatDateTime('DD/MM/YYYY HH:NN:SS',now)+' Done');
Lista.SaveToFile(froot+formatdatetime('YYMMDDHHNNSSZZZ',now)+'.log');
finally
lista.Free;
end;
{$ENDIF}
inherited;
end;
procedure TfMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var lista:TStringList;
begin
{$IFDEF MSWINDOWS}
CanClose:=false;
try
lista:=TStringList.Create;
lista.Add(FOrmatDateTime('DD/MM/YYYY HH:NN:SS',now)+' FormCloseQuery');
Lista.SaveToFile(froot+formatdatetime('YYMMDDHHNNSSZZZ',now)+'.log');
SincroClose();
lista.Add(FOrmatDateTime('DD/MM/YYYY HH:NN:SS',now)+' Done');
Lista.SaveToFile(froot+formatdatetime('YYMMDDHHNNSSZZZ',now)+'.log');
CanClose:=true;
finally
lista.Free;
end;
{$ENDIF}
end;
只有正常关闭应用程序,在 FormCloseQuery 事件下可以正常工作,但是当 Windows 关闭时,我的应用程序将关闭而不保存任何数据
【问题讨论】:
-
@David Hefferman N.B.这个问题不是 [Delphi prevent application shutdown][1] 我不明白的是为什么我的应用程序无法拦截 WM_QUERYENDSESSION 或 WM_ENDSESSION
-
从已知可以工作的代码开始,你有这些代码,然后从那里开始工作。此外,你的生命周期管理被打破了。尝试前获取。
-
在 Vista 及更高版本上,使用
ShutdownBlockReasonCreate(),这在Application Shutdown Changes in Windows Vista 中进行了讨论。 Windows 关闭不是执行数据库查询的好时机。如果数据库引擎在您的应用程序之前关闭怎么办?在任何情况下,请提供Minimal, Complete, and Verifiable example 证明您没有收到消息。也可以尝试使用TApplication.HookMainWindow()来接收它们。 -
消息处理程序用于 VCL。开始here。
-
关键是能够接收这些消息。您的主窗体是一个可见的顶级窗口。您不能使用 FMX 方法挂钩它的 winproc。不过,您可以获得 HWND。然后你就可以使用标准的 winapi 挂钩了。
标签: delphi firemonkey