如何在 IDE 运行 时捕获 Delphi 应用程序关闭?

How to catch Delphi App shutting down when run in IDE?

场景

在 Windows 10 上使用 Delphi 2009 我有一个应用程序可以执行关闭操作,例如日志记录和数据库操作。 用户可以在主窗体上调用 Form.Close 的任何地方退出应用程序,该主窗体调用一个过程来执行所需的操作。无论用户是通过菜单退出还是使用 Windows 任务栏图标关闭 window(就像我的一些用户所做的那样),这都可以正常工作。

问题

但是,在 IDE 中调试应用程序时,单击 Delphi 菜单栏中的红色方块以停止应用程序 运行 不会调用 Form.Close,因此没有调用我的关机程序。

问题

有没有办法让应用在通过 IDE 关闭时正确调用 form.close 以确保所有部分都得到调试?

其他信息

我看过 here,它描述了一种使用 WMQueryEndSession 捕获 windows 关闭消息的方法,但是当我在我的应用程序中使用该代码时,它不会在 IDE关闭应用程序,所以 IDE 可能使用了不同的方法。

我的 WMQueryEndSession 过程中使用的代码e

procedure TFrmMain.WMQueryEndSession(var Msg: TWMQueryEndSession);
  {intercept the shut down message and call our proc first 
   SafeFormClose is very simple and quick so no issues. 
   Also called first in case the inherited procedure shuts us down
   before SafeFormClose has a chance to run}
begin
  SafeFormClose;    //Do our shut down and logging stuff
  Msg.Result := 1;  //Signal that it is OK for Windows to shut us down
  inherited;        //Do whatever the original handler would have done.
end;

如果您 运行 在调试器中安装程序,单击红色方块(重置按钮)会立即终止程序。调试器完全控制了程序,单击重置按钮后不再有代码运行。

这不同于例如在任务管理器中终止程序(在这种情况下 Windows 会向程序发送一个关闭信号,如果它还不想关闭,它可能会拒绝它) .

您应该设计程序,如果它在任何时候停止,下次启动时它会修复由重置引起的任何问题(例如修复损坏的数据库文件)。这是断电或操作系统崩溃时可能发生的真实情况。您不能相信您的关机例程每次都可以 运行。