2011-03-01 83 views
1

我有一个由服务启动的应用程序。该应用程序没有用户界面,它包含一个DataModule和一个在一个循环中调用Forms.Application.HandleMessage的TMyApplication实现(如SvcMgr.TServiceApplication)。我挂钩了MainWindow来记录Forms.Application收到的隐藏窗口的任何消息。检测系统用户关机

  • 如果我手动启动该应用程序,它运行在我的useraccount,我Forms.Application隐藏的窗口收到WM_QUERYENDSESSION WM_ENDSESSION和信息注销/关闭时。
  • 如果我使用该服务启动我的应用程序,则应用程序将在SYSTEM帐户下运行。在系统帐户下运行时,在我的应用程序被Windows强制终止之前,我在系统关机时只收到一条消息$0000001A(WM_WININICHANGE?)。所以没有WM_QUERYENDSESSION和WM_ENDSESSION消息。

如何检测系统帐户上的Windows关机并优雅地关闭我的应用程序?

+0

你为什么不直接运行你的服务? – 2011-03-01 16:11:54

+3

我知道它没有回答你的问题,但在SYSTEM帐户下运行一个进程被认为是非常糟糕的做法。如果您已经意识到了这一点,那么我很抱歉无法接听。 – 2011-03-01 16:39:59

回答

4

让你的服务通知你的子应用程序。

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

http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/063cef3a-de94-44d5-8f2e-4e63c3cfdee8

做一个FindWindow函数和PostMessage的(HWND,WM_ENDSESSION)自己。

+0

是的,这是我正在考虑的解决方法。我可以覆盖TService的'DoShutDown'方法并关闭我的应用程序。我只是想知道是否有办法检测应用程序本身的关闭。 – 2011-03-01 19:00:11

+0

您正在服务上下文中运行最终用户应用程序,因此就MS而言,您已经在线外着色了。你将不得不自己破解这个。 – 2011-03-02 14:20:47