【问题标题】:C++: How do I check if my window is about to close?C++:如何检查我的窗口是否即将关闭?
【发布时间】:2012-03-11 06:22:00
【问题描述】:

我正在尝试制作基于 Win32/*nix 控制台的 ASCII 游戏。我不想使用任何非标准 C++ 或 *nix/windows(.h) 上的库。

我希望它的结构类似于游戏循环。又名:

while (!WIN_CLOSE_FUNCTION()) {
  //Do crap
}
//Do other shutdown crap
return 0;

谁能指出这将是什么功能?如果它依赖于平台,请给我一个关于 Windows 和 *nix 的示例。

【问题讨论】:

    标签: c++ event-handling console-application


    【解决方案1】:

    可能对您有帮助的类似问题What happens when you close a c++ console application

    接受的答案是: 如果使用 SetConsoleCtrlHandler 函数设置控制处理程序,则使用右上角的“x”关闭 c++ 控制台应用程序会引发 CTRL_CLOSE_EVENT 并进行处理。

    有用的链接:

    在 *nix 上:

    在 Linux 和其他 Unix 系统上,控制台作为单独的进程运行。当您关闭 shell 时,它会向当前活动的进程或未在后台执行的进程发送 SIGHUP 信号。如果程序员不处理它,则该过程简单地终止。如果您关闭与终端和活动进程的 SSH 会话,则会发送相同的信号。

    @Zyx 在上面链接的问题中提供的答案

    【讨论】:

    • 我一定会对此进行调查。但这只是Win32,你能提供一个*nix的例子吗?
    【解决方案2】:

    对于 Unix/Linux 控制台,没有这样的功能。您可以做的最接近的是捕获丢失终端时发送的信号SIGHUP。但是请注意,您可以在信号处理程序中执行的操作非常有限。可能最接近您的循环的是(注意:未经测试的代码):

    #include <signal.h>
    
    volatile sig_atomic_t hupflag = 0;
    
    extern "C" void hangup(int)
    {
      hupflag = 1;
    }
    
    int main()
    {
      sigaction act;
      act.sa_handler = hangup;
      act.sa_mask = 0;
      act.sa_flags = 0;
      if (sigaction(SIGHUP, &act, 0) < 0)
      {
        std::cerr << "could not install signal handler\n";
        return 1;
      }
    
      while (!hupflag)
      {
        // ...
      }
      // shutdown
      return 0;
    }
    

    【讨论】:

      【解决方案3】:

      本身没有这样的功能,但 Unix 和 Windows 都会发送 一个信号(SIGHUP 在 Unix 下,SIGBREAK 在 Windows 下)给所有 进程组中的进程当进程所在的窗口 组依赖已关闭。所以你所要做的就是捕捉信号并 设置一个标志,你在循环中测试:

      #ifdef _WIN32
      int const sigClosed = SIGBREAK;
      #else
      int const sigClosed = SIGHUP;
      #endif
      
      volatile sig_atomic_t windowClosed = 0;
      
      void signalHandler( int )
      {
          windowClosed = 1;
      }
      
      //  ...
      signal( sigClosed, signalHandler );
      while ( windowClosed == 0 ) {
          //  ...
      }
      

      如果您在循环中从控制台执行任何输入,您将获得 为输入失败做好准备(无论如何你都应该这样做)。

      【讨论】:

        猜你喜欢
        • 2012-03-08
        • 2017-02-21
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 2011-09-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多