C ++: Come posso controllare se la mia finestra sta per chiudere?

Sto cercando di creare un gioco ASCII basato su console Win32 / * nix. Non voglio usare librerie di alcun tipo che non siano C ++ standard o su * nix / windows (.h).

Voglio che sia strutturato come un loop di gioco. aka:

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

Qualcuno può indicarmi quale funzione sarebbe questa? Se dipende dalla piattaforma, dammi un esempio su Windows e * nix.

Domanda simile che potrebbe aiutarti Cosa succede quando chiudi un’applicazione console c ++

La risposta accettata è: la chiusura di un’app console c ++ con la “x” nell’angolo in alto genera un CTRL_CLOSE_EVENT che è ansible acquisire ed elaborare se si imposta un gestore di controllo utilizzando la funzione SetConsoleCtrlHandler.

Link utili:

  • Gestione eventi console
  • SetConsoleCtrlHandler

Su * nix:

Su Linux e altri sistemi Unix, la console viene eseguita come processo separato. Quando chiudi la shell, invia il segnale SIGHUP al processo o ai processi attualmente attivi che non vengono eseguiti in background. Se il programmatore non lo gestisce, il processo termina semplicemente. Lo stesso segnale viene inviato se si chiude la sessione SSH con un terminale e un processo attivo.

risposta fornita da @Zyx nella domanda collegata sopra

Per la console Unix / Linux, non esiste tale funzione. Il più vicino che puoi fare è catturare il segnale SIGHUP che viene inviato quando SIGHUP il terminale. Tuttavia, tieni presente che le cose che puoi fare in un gestore di segnale sono piuttosto limitate. Probabilmente il più vicino al tuo loop sarebbe (nota: codice non testato):

 #include  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; } 

Non esiste una funzione di per sé, ma sia Unix che Windows invieranno un segnale ( SIGHUP sotto Unix, SIGBREAK sotto Windows) a tutti i processi nel gruppo processo quando la finestra da cui dipende il gruppo di processi è chiusa. Quindi tutto ciò che devi fare è catturare il segnale e impostare un flag, che testerai nel loop:

 #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 ) { // ... } 

Se stai facendo un input dalla console nel loop, avrai la possibilità che l’input fallisca (cosa che dovresti comunque fare).