如何在Qt中检测Windows关闭或注销

adn*_*ili 6 c++ windows qt qt-signals qtcore

我正在将一个Linux应用程序移植到用Qt编写的Windows.应用程序需要在关闭前保存一些设置.在Linux上,我们可以通过SIGTERM等的信号处理程序来实现.我如何在Windows上实现相同的功能.

lpa*_*app 8

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

void QCoreApplication :: aboutToQuit()[signal]

当应用程序即将退出主事件循环时,例如当事件循环级别降至零时,将发出此信号.这可能在从应用程序内部调用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


Rei*_*ica 5

我认为其他答案完全没有抓住重点:当您强行结束应用程序时,就像 Unix 上的 SIGKILL 一样。没有办法处理它——除非提前提前处理的意思是确保每次更改设置时都保存设置。当然,您可以优化此行为,例如,如果设置很脏,则每隔几秒钟保存一次设置,如果您想最小化磁盘访问次数(想想移动设备上的功耗)。

很多都是由QSettings你处理的。只要你使用QSettings,你就会得到合理的行为。如果您自己保存文件,请使用QSaveFile它来处理刷新文件和近似原子文件替换,这样如果在您进行写入的过程中出现终止(强制终止),您就不会丢失设置。

如果您想在应用程序被要求退出时简单地做某事,则aboutToQuit发出的信号QCoreApplication就是您想要做出反应的信号。这相当于处理WM_QUIT消息,或者SIGTERM在Unix上处理。因此,以特定于平台的方式进行操作毫无意义,因为 Qt 已经为您完成了。处理同样没有意义,WM_CLOSE因为这是一条只有 Windows 才能收到的消息,而且 Qt 已经为您处理过了。

您还可以通过安装QAbstractNativeEventFilter和处理WM_ENDSESSION和来参与注销/关闭过程WM_QUERYENDSESSION。这仅在您想提前知道应用程序将退出时才有意义。除非您明确想停止关机/注销,否则您无需担心。