Sinais de CTRL+C e CTRL+BREAK
As combinações das teclas CTRL+C e CTRL+BREAK recebem tratamento especial por processos de console. Por padrão, quando uma janela do console tem o foco do teclado, CTRL+C ou CTRL+BREAK é tratado como um sinal (SIGINT ou SIGBREAK) e não como entrada de teclado. Por padrão, esses sinais são passados para todos os processos de console anexados ao console. (Processos que não estiverem anexados não serão afetados. Confira Criação de um console.) O sistema cria um thread em cada processo de cliente para manipular o evento. O thread gerará uma exceção se o processo estiver sendo depurado. O depurador pode manipular a exceção ou continuar com a exceção sem tratamento.
CTRL+BREAK é sempre tratado como um sinal, mas um aplicativo pode alterar o comportamento padrão CTRL+C de duas maneiras que impedem que as funções do manipulador sejam chamadas:
- A função SetConsoleMode pode desabilitar o modo de entrada ENABLE_PROCESSED_INPUT para o buffer de entrada de um console, portanto CTRL+C é relatado como entrada de teclado, e não como um sinal.
- Quando SetConsoleCtrlHandler é chamado com os valores NULL e TRUE para os parâmetros dele, o processo de chamada ignora os sinais CTRL+C. O processamento normal de CTRL+C é restaurado chamando SetConsoleCtrlHandler com os valores NULL e FALSE. Esse atributo de ignorar ou não ignorar os sinais CTRL+C é herdado por processos filho, mas pode ser habilitado ou desabilitado por qualquer processo sem afetar os processos existentes.
Para obter mais informações sobre como esses sinais são processados, incluindo tempos limite, confira a documentação de retorno de chamada Rotina do Manipulador.