SetConsoleCtrlHandler routine issue

后端 未结 5 885
逝去的感伤
逝去的感伤 2021-02-18 21:43

I\'m writting a console application in C++.

I use SetConsoleCtrlHandler to trap close and CTRL+C button. This allows for all my threads to stop and exit properly.

<
相关标签:
5条回答
  • 2021-02-18 21:51

    I suspect that this is by-design on Windows 7 - if the user wants to quit your application, you're not allowed to tell him "No".

    0 讨论(0)
  • 2021-02-18 21:52

    It looks like you can no longer ignore close requests on Windows 7.

    You do get the CTRL_CLOSE_EVENT event though, and from that moment on, you get 10 seconds to do whatever you need to do before it auto-closes. So you can either do whatever work you need to do in the handler or set a global flag.

    case CTRL_CLOSE_EVENT: // CTRL-CLOSE: confirm that the user wants to exit.
                           close_flag = 1;
                           while(close_flag != 2)
                             Sleep(100);
                           return TRUE;
    

    Fun fact: While the code in your CTRL_CLOSE_EVENT event runs, the main program keeps on running. So you'll be able to check for the flag and do a 'close_flag = 2;' somewhere. But remember, you only have 10 seconds. (So keep in mind you don't want to hang up your main program flow waiting on keyboard input for example.)

    0 讨论(0)
  • 2021-02-18 21:56

    Xavier's comment is slightly wrong. Windows 7 allows your code in the event handler ~10 seconds. If you haven't exited the event handler in 10 seconds you are terminated. If you exit the event handler you are terminated immediately. Returning TRUE does not post a dialog. It just exits.

    0 讨论(0)
  • 2021-02-18 22:10

    You're making this more complicated than it needs to be. I don't know exactly why your app is closing, but SetConsoleCtrlHandler(NULL, TRUE) should do what you want:

    http://msdn.microsoft.com/en-us/library/ms686016(VS.85).aspx

    If the HandlerRoutine parameter is NULL, a TRUE value causes the calling process to ignore CTRL+C input, and a FALSE value restores normal processing of CTRL+C input.

    0 讨论(0)
  • 2021-02-18 22:12

    There is no need to wait for any flag from the main thread, the handler terminates as soon as the main thread exits (or after 10s).

    BOOL WINAPI ConsoleHandler(DWORD dwType)
    {
        switch(dwType) {
        case CTRL_CLOSE_EVENT:
        case CTRL_LOGOFF_EVENT:
        case CTRL_SHUTDOWN_EVENT:
    
          set_done();//signal the main thread to terminate
    
          //Returning would make the process exit!
          //We just make the handler sleep until the main thread exits,
          //or until the maximum execution time for this handler is reached.
          Sleep(10000);
    
          return TRUE;
        default:
          break;
        }
        return FALSE;
    }
    
    0 讨论(0)
提交回复
热议问题