如何在Windows注销确定之前保持用户进程运行?

问题描述 投票:-2回答:1

我有一个在Windows上运行的应用程序,在用户的会话中,我不希望用户能够意外关闭。

用户可以关闭它的一种方法是通过保存未保存的数据(例如在记事本中)并开始注销过程。记事本拒绝WM_QUERYSESSION消息; Windows提示用户存在未保存的数据;并且用户可以取消注销。

其他应用程序(包括我的),获取WM_QUERYSESSION,以TRUE响应,然后获取WM_ENDSESSION,并退出。重要的是,在Windows甚至决定在记事本中提示用户未保存的数据之前,他们会退出。

如果用户取消注销,则最终结果是用户的会话继续,而没有所有遵循结束会话消息的进程。

我试图找到一种方法是让我的进程保持运行,直到我们超过用户可以取消注销的程度。看看关于这个的微软文档,我没有看到一个明显的方法 - 每个进程都通过它自己的WM_QUERYSESSION> WM_ENDSESSION,并且文档明确指出每个应用程序独立发生这种情况。

我不想用FALSE回复WM_QUERYSESSION,因为我不想自己阻止注销,只要其他东西阻止它就继续运行。

有没有其他方法可以找出Windows何时确定所有WM_QUERYSESSION消息都被TRUE回复,并且注销是不可避免的?

(我认为这是一个Windows问题,而不是特定于我正在使用的语言的问题,但是如果它很重要,那就是PureBasic。但任何Win32 API方法都应该可行。)

windows winapi
1个回答
2
投票

如果任何应用程序返回FALSE到WM_QUERYENDSESSION,已经返回TRUE的应用程序将收到WM_ENDSESSIONwParam=FALSE以指示已取消关闭。

如果所有应用程序都返回TRUE到WM_QUERYENDSESSION,那么他们才会收到带有WM_ENDSESSIONwParam=TRUE,表示正在关机。

有关Application Shutdown Changes in Windows VistaRestart Manager: Guidelines for Applications如何工作的更多详细信息,请参阅WM_QUERYENDSESSIONWM_ENDSESSION

您的应用是否关注wParam给出的WM_ENDSESSION值?或者只是在收到WM_ENDSESSION时无条件退出?并非所有应用都像他们应该那样关注。确保你的确如此。


更新:根据WM_QUERYENDSESSION文档和Logging Off文档:

当应用程序为WM_QUERYENDSESSION返回TRUE时,它会收到WM_ENDSESSION消息并终止,无论其他应用程序如何响应WM_QUERYENDSESSION消息。

所以,你的应用程序真的没有什么可以做的。一旦它响应TRUEWM_QUERYENDSESSION,就是它,游戏结束。您的应用程序将收到WM_ENDSESSION并在几秒内无法退出时被强行终止,无论其他应用程序如何响应关机。

因此,我能想到的唯一方法是真正检测会话实际结束的时间是使用服务,因为服务可以接收SERVICE_CONTROL_SHUTDOWNSERVICE_CONTROL_SESSIONCHANGE通知。

© www.soinside.com 2019 - 2024. All rights reserved.