Ir para o conteúdo

Tecla premida sem ENTER - kbhit

Muitos questionam-se sobre como ler uma tecla premida pelo utilizador durante um ciclo sem que este faça pausa. Os métodos habituais, nomeadamente o getchar (ou o getch da biblioteca conio.h), forçarão o ciclo a parar.

Isto torna-se fácil de se entender quando temos um ciclo que realiza um processo mais complexo e moroso, e queremos que, se o utilizador desista do processo, prima ESC e o processo termine: evita-se que o utilizador, ou tenha de esperar até ao fim, ou tenha de fechar e voltar a iniciar a aplicação.

O código que nos indica que o utilizador premiu uma tecla durante um processo, sem necessidade de pausa do programa, é o kbhit. Diremos em português "se uma tecla foi premida, então faz <comandos>". Em C:

if (kbhit()) {
    comandos;
}

Aplicando directamente no exemplo do ciclo, que se interrompe em caso de ESC:

char c = 0

while (condição_de_paragem_normal) {
    comandos;
    if ( kbhit() ) {
        c = getch();
        if (c == 27) {
            printf("Processo interrompido.\n");
            break;
        }        
    }
}