C++ 与Windows重新启动/关闭的交互

C++ 与Windows重新启动/关闭的交互,c++,winapi,C++,Winapi,例如,我们有一个Win32应用程序,它在主窗口关闭时隐藏到托盘。 当用户重新启动或关闭操作系统时,应用程序以某种方式关闭。 如何正确处理此关闭事件?您应该处理WM_QUERYENDSESSION和WM_ENDSESSION。这在MSDN上有记录: 基本上,您需要一个顶级窗口来侦听WM_QUERYENDSESSION或WM_ENDSESSION或两者。当这些消息到达时,您将有机会执行关机相关任务 具有窗口和消息队列的应用程序通过WM_QUERYENDSESSION和WM_ENDSESSION消息接

例如,我们有一个Win32应用程序,它在主窗口关闭时隐藏到托盘。
当用户重新启动或关闭操作系统时,应用程序以某种方式关闭。

如何正确处理此关闭事件?

您应该处理WM_QUERYENDSESSION和WM_ENDSESSION。

这在MSDN上有记录:

基本上,您需要一个顶级窗口来侦听
WM_QUERYENDSESSION
WM_ENDSESSION
或两者。当这些消息到达时,您将有机会执行关机相关任务

具有窗口和消息队列的应用程序通过WM_QUERYENDSESSION和WM_ENDSESSION消息接收关机通知。这些应用程序应返回TRUE以指示可以终止它们。除非绝对必要,否则应用程序不应阻止系统关闭。在处理WM_ENDSESSION时,应用程序应执行任何必需的清理。具有未保存数据的应用程序可以将数据保存到临时位置,并在下次启动应用程序时将其还原。建议应用程序经常保存其数据和状态;例如,在用户启动的保存操作之间自动保存数据,以减少关机时要保存的数据量

如果您希望在关机期间显示UI,可能是因为您的应用程序正在执行无法经受中断的关键操作,那么您可以使用
ShutdownBlockReasonCreate

如果应用程序必须阻止潜在的系统关闭,则可以调用ShutdownBlockReasonCreate函数。调用者提供将向用户显示的原因字符串。原因字符串应简短明了,为用户提供决定是否继续关闭系统所需的信息


请注意,这个过程与Vista相比发生了巨大的变化。如果您需要支持XP,那么您可能需要在XP下表现不同的代码。MSDN上也介绍了该主题:。

关闭会导致向您的程序发送SIGTERM或SIGINT。 你可以通过电脑来处理。 参考:


是Windows,不是POSIX。你说得对。没有阅读“SIGILL和SIGTERM信号不是在Windows下生成的。”在MSDN中…特别是引用MSDN:“任何Win32应用程序都不支持SIGINT…SIGILL和SIGTERM信号不是在Windows下生成的。”隐藏在托盘中的应用程序无论如何都不应该执行此类关键操作。可能没有理由在关机时突然显示UI。@mAlters也许CD刻录应用程序会合理地隐藏在通知区域中。我不知道asker的应用程序在做什么。IIRC这样的应用程序应该最小化,而不是完全消失。通知区域用于在发生有趣的事情之前一直处于空闲状态的小进程。@MSalters。我只是想说明事实。您是想处理关机问题,还是想将应用程序隐藏为系统托盘图标?
void my_handler (int param)
{
  // clean up here
}
int main ()
{
    signal(SIGINT my_handler);   // try also SIGTERM
}