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

时间:2014-11-12 15:28:03

标签: c++ winapi

例如,我们有一个Win32应用程序,它在主窗口关闭时隐藏到托盘 当用户重启或关闭OS应用程序以某种方式关闭时 如何妥善处理这一结束事件?

3 个答案:

答案 0 :(得分:2)

您应该处理System Shutdown Messages WM_QUERYENDSESSION和WM_ENDSESSION。

答案 1 :(得分:2)

这在MSDN上有记录:Shutting Down

基本上,您需要一个顶级窗口,可以监听WM_QUERYENDSESSIONWM_ENDSESSION或两者。当这些消息到达时,您有机会执行与关机相关的任务。

  

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

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

  

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

请注意,此过程从Vista中发生了巨大变化。如果您需要支持XP,那么您可能需要在XP下行为不同的代码。 MSDN上也涵盖了该主题:Application Shutdown Changes in Windows Vista

答案 2 :(得分:-2)

Shuting down会导致SIGTERM或SIGINT被发送到您的程序。 你可以通过这个来处理。 参考:http://www.cplusplus.com/reference/csignal/signal/

void my_handler (int param)
{
  // clean up here
}
int main ()
{
    signal(SIGINT my_handler);   // try also SIGTERM
}