Intercettare tasto invio in C++

Mattepuffo's logo
Intercettare tasto invio in C++

Intercettare tasto invio in C++

Ho un programma in C++ che si avvia e rimane attivo in attesa di connessioni con un ciclo infinito.

Voglio poterlo terminare usando il semplice tasto ENTER / INVIO.

Vediamo come fare sia in Visual C++ (quindi una versione per Windows), sia in C++ usando Ncurses (che gira quindi su Linux).

Visto che la versione VC++ è più semplice partiamo da qua.

Per controllare la pressione dei tasti su Windows dobbiamo usare la libreria conio.h.

Quindi includiamola e poi nel main:

#include // TUTTO QUELLO CHE VI SERVE
................
#include <conio.h>

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
       // LANCIO PROGRAMMA CON CICLO INFINITO
       if(_getch() == 13)
       {
           // ESCO DAL PROGRAMMA
       }
      return 0;
}

La funzione _getch() controlla il carattere premuto; nella tabella ASCII il 13 corrisponde ad ENTER.

Se viene premuto esco dal programma.

Per Linux invece dobbiamo agire in maniera diversa in quanto conio.h è una libreria specifica Microsoft.

Ci sono vari porting per Linux, ma da quanto ho capito si basano anche su Ncurses.

Quindi io ho usato direttamente questa libreria.

Per programmare con questa libreria bisogna prima installare i pacchetti devel; su Opensuse:

# zypper install ncurses-devel

Questo pacchetto non è richieso per l'esecuzione, ma è comunque richiesto ncurses.

Dopo di che in fase di lancio dobbiamo linkare due librerie; quindi aggiungete due parametri (io li ho impostati direttamente nell'IDE):

-lncurses -ltinfo

A questo punto vediamo il main:

#include <cstdlib>
#include <iostream>
#include <ncurses.h>

int main(int argc, char** argv) {
    (void) initscr(); // INIZIALIZZA NCURSES
    keypad(stdscr, TRUE); // ABILITA MAPPATURA TASTIERA
    (void) nonl(); // NON CONVERTE NL->CR/NL IN OUTPUT
    (void) cbreak(); // PRENDE I CARATTERI IN INPUT UNO ALLA VOLTA SENZA ATTENDERE
    (void) noecho(); // NESSUN ECHO DA INPUT
    for (;;) {
        int c = getch();
        if (c == 13) {
            endwin();
            exit(0);
        }
    }
}

Semplice main di esempio.

Come vedete includo la libreria ncurses.h.

Poi le righe sono commentate e non richiedono ulteriori spiegazioni.

Poi ciclo for infinito fino a che non viene premuto il tasto ENTER.

Diciamo che bene o male le due versioni sono simili.

Enjoy!!


Condividi

Commentami!