Windows 作为系统用户检测关机

Windows 作为系统用户检测关机,windows,delphi,service,shutdown,Windows,Delphi,Service,Shutdown,我有一个由服务启动的应用程序。该应用程序没有用户界面,它包含一个DataModule和一个TMYAApplication实现,该实现在类似SvcMgr.TServiceApplication的循环中调用Forms.application.HandleMessage。我钩住主窗口来记录窗体隐藏窗口中的所有消息。应用程序接收 如果我手动启动应用程序,使其在我的用户帐户上运行,则在注销/关闭时,我会在Forms.application的隐藏窗口上收到WM_QUERYENDSESSION和WM_ENDS

我有一个由服务启动的应用程序。该应用程序没有用户界面,它包含一个DataModule和一个TMYAApplication实现,该实现在类似SvcMgr.TServiceApplication的循环中调用Forms.application.HandleMessage。我钩住主窗口来记录窗体隐藏窗口中的所有消息。应用程序接收

如果我手动启动应用程序,使其在我的用户帐户上运行,则在注销/关闭时,我会在Forms.application的隐藏窗口上收到WM_QUERYENDSESSION和WM_ENDSESSION消息。 如果我使用服务启动应用程序,应用程序将在系统帐户下运行。在系统帐户下运行时,在Windows强制终止应用程序之前,在系统关闭时,我只收到一条消息,$0000001A WM_WININICHANGE。因此没有WM_QUERYENDSESSION和WM_ENDSESSION消息。
如何检测系统帐户上的Windows关闭并优雅地关闭我的应用程序?

让您的服务通知您的子应用程序

以下是有关服务控制管理器如何通知您的服务的一些信息:


自己做一个FindWindow,PostMessagehwnd,WM_ENDSESSION。

让您的服务通知您的子应用程序

以下是有关服务控制管理器如何通知您的服务的一些信息:


你自己做一个FindWidow,PostMessagehwnd,WM_ENDSESSION。

为什么不运行你服务的所有东西呢?我知道这不能回答你的问题,但在系统帐户下运行进程被认为是非常糟糕的做法。如果你已经意识到了这一点,那么我为你的胡言乱语道歉。你为什么不把你的服务全部用完呢?我知道这并不能回答你的问题,但在系统帐户下运行进程被认为是非常糟糕的做法。如果你已经意识到了这一点,那么我为你的胡言乱语道歉。是的,这就是我正在考虑的解决办法。我可以重写TService的DoShutDown方法并关闭我的应用程序。我只是想知道是否有一种方法可以检测应用程序本身的关闭。您正在服务上下文中运行一个最终用户应用程序,因此就MS而言,您已经超出了范围。你必须自己解决这个问题。是的,这是我正在考虑的解决办法。我可以重写TService的DoShutDown方法并关闭我的应用程序。我只是想知道是否有一种方法可以检测应用程序本身的关闭。您正在服务上下文中运行一个最终用户应用程序,因此就MS而言,您已经超出了范围。你必须自己解决这个问题。