如何检测Windows关机或在Qt注销

我正在将一个Linux应用程序移植到用Qt编写的Windows中。 应用程序需要在closures之前保存一些设置。 在Linux上,我们可以通过SIGTERM的信号处理程序来做到这一点。我如何在Windows上实现相同的function。

Solutions Collecting From Web of "如何检测Windows关机或在Qt注销"

如果您正在使用Qt事件循环,则可以捕获以下信号:

无效QCoreApplication :: aboutToQuit()[信号]

当应用程序即将退出主事件循环时,例如事件循环电平降至零时,会发出此信号。 在从应用程序内部调用quit()或者关闭整个桌面会话时,可能会发生这种情况。 如果您的应用程序需要做一些最后一次清理,信号特别有用。 请注意,在这种状态下,用户交互是不可能的。

除此之外,如果上述信号不适合您的用例,您可能会在下面查找以下消息:

WM_QUIT: http : //msdn.microsoft.com/en-us/library/windows/desktop/ms632641( v=vs.85) .aspx

WM_CLOSE: http : //msdn.microsoft.com/en-us/library/windows/desktop/ms632617( v=vs.85) .aspx

WM_QUERYENDSESSION: http : //msdn.microsoft.com/en-US/library/windows/desktop/aa376890.aspx

WM_ENDSESSION: http : //msdn.microsoft.com/en-US/library/windows/desktop/aa376889.aspx

我认为其他答案完全错过了这一点: 当你强行结束一个应用程序,就像在Unix上的SIGKILL。 没有办法处理它 – 除了提前 我的意思是提前处理它,确保每次更改都保存设置。 当然,您可以优化这种行为,例如,如果您希望最大限度地减少磁盘访问次数(考虑移动设备上的功耗),则可以每隔几秒保存设置。

很多这个是由QSettings为你处理的。 只要你使用QSettings ,你会得到合理的行为。 如果你自己保存文件,使用QSaveFile因为它处理文件的刷新和逼近原子文件替换,所以如果kill(强制终止)在你写作的中间,你将不会丢失设置。

QCoreApplication发出的aboutToQuit信号是你想要做的反应,如果你想简单地做一些事情,当应用程序被要求退出。 这相当于处理WM_QUIT消息, 或者在Unix上处理SIGTERM 因此,以特定于平台的方式来做这件事是没有意义的,因为Qt已经为你做了。 处理WM_CLOSE同样没有意义,因为这是一个只有windows才能得到的消息,Qt已经为你处理了。

您也可以通过安装QAbstractNativeEventFilter并处理WM_ENDSESSIONWM_QUERYENDSESSION参与注销/关闭过程。 这只有在你想提前知道应用程序将被退出时才有意义。 除非你明确地要停止关机/注销,否则不需要担心。

我不知道Qt。 如果你能买得起Windows,只有WM_QUERYENDSESSIONWM_ENDSESSION消息可能是正确的。

我认为最好是处理QApplication :: commitDataRequest信号(或QG5中的QGuiApplication :: commitDataRequest)而不是aboutToQuit。 只需将信号连接到您的功能来保存设置。

这里有一些相关的讨论: http : //qt-project.org/forums/viewthread/33329