Detecter la touche escape et la touche fleche bas

Bonjour,
Comment detecter la touche escape ainsi que la touche fleche bas.
Le scan code de la touche escape est 0x1B
Le scan code de la touche fleche bas est 0x1B 0x5B 0x42

Contrairement a ce que j'ai vu sur le net les touches ne renvoi pas 0 quand c'est une touche étendue (F10, fleche haut, fleche bas ...), ca retourne 0x1B, du coup la touche Escape ne peut pas être détectée car il croit que c'est une touche étendue.

vous pouvez tester avec le code ci-dessous:

void loop()
{
  int c;
  c = Serial.read(); 
 
  xprintf("%02X ", c);
  delay(1);
}

le code suivant fonctionne mais je ne peut pas détecter la touche ESC:

if (_kbhit())
    {
      key = _getch();
      Serial.print(key); Serial.print("  "); Serial.println(key, HEX);
      if (key == 0x1B) {
        _getch();
        switch (_getch()) {
          case KB_DOWN: itemno++; itemno %= nitems; break;
          case KB_UP: if (itemno > 0) itemno--;  else itemno = nitems - 1; break;
          //case KB_ESC: _cursoron(); return 0;
        }
      } else if (key == KB_ENTER){
        _cursoron(); return itemno + 1;
      } else if (key == KB_ESC){
        _cursoron(); _cursoron(); return 0;
      }      
    }
  }

pour KEY_DOWN et KEY_UP ca fonctionne mais pour la touche ESC je ne sais pas comment faire.
Les fonctions _kbhit() et _getch() encapsule le code serial qui fonctionne très bien, le problème ne vient pas de ces fonctions.

Merci de votre aide.

Désolé pour le code, mais je ne sais pas mettre le code entre les balises.

Il faut que tu expliques le contexte : quelle est la bibliothèque utilisée, quel hardware, quelle connexion, quel OS, etc ? Là, je n'y comprends rien...

PS : voir ici

J'utilise le VGA32 à base de ESP32, j'uitilise la bibliothèque fabgl avec arduino et le core ESP32.
je voudrais détecter les touches up, down, enter et escape, sur un menu en liste déroulante avec le terminal de la bibliothèque.
Mon problème est un problème de langage c sous arduino.

en fait le but est de tester la touche ESCAPE et aussi les touches DOWN et UP, mais comme j'utilise le code 0x1B (27) pour tester les touches étendues je ne peux pas tester seule la touche ESCAPE.

if (_kbhit())
    {
      key = _getch();
      Serial.print(key); Serial.print("  "); Serial.println(key, HEX);
      if (key == 0x1B)
      {
        _getch();
        switch (_getch()) {
          case KB_DOWN: itemno++; itemno %= nitems; break;
          case KB_UP: if (itemno > 0) itemno--;  else itemno = nitems - 1; break;
            //case KB_ESC: _cursoron(); return 0;
        }
      } else if (key == KB_ENTER) {
         return itemno + 1;
      } else if (key == KB_ESC) {  //<== ne passera jamais par ici car je teste le meme code pour les touches étendues
         return 0;
      }
    }

il y a une facon, c'est de ne jamais utiliser la touche escape pour sortir par exemple mais utiliser la touche F10, mais ce n'est pas la solution idéale.
Je suppose qu'il y a au moins un programmeur sur la planète qui a déjà tester dans un menu la touche escape ainsi que d'autres touches de fonction étendue ?

LE code ci-dessous fonctionne mais a une condition que j'appuie deux fois sur la touche ESCAPE pour l'utiliser:

if (_kbhit())
    {
      key = _getch();
      switch (key)
      {
        case KB_UP: if (itemno > 0) itemno--;  else itemno = nitems - 1; break;
        case KB_DOWN: itemno++; itemno %= nitems; break;
        case KB_ESC: _cursoron(); return 0;
        case KB_ENTER: _cursoron(); return itemno + 1;
      }
    }
int _getch(void)
{
  int ch;

  while(!_kbhit());
  ch = Terminal.read();
 
  if (ch == 0x1B) {
    while(!_kbhit());
    ch = Terminal.read();      
  }
 
  return ch;
}

Problème résolu avec le code suivant sous fabgl.

if (keyboard->isKeyboardAvailable()) {
        if (keyboard->scancodeAvailable())
        {
          int scode = keyboard->getNextScancode();
          if (scode == 0xF0 || scode == 0xE0) ++clen;
          --clen;
          if (clen == 0) {
            clen = 2;            
            switch (scode)
            {
              case KB_LEFT: if (itemno > 0) itemno--;  else itemno = nitems - 1; break;
              case KB_RIGHT: itemno++; itemno %= nitems; break;
              case KB_ESC: /*_cursoron();*/ return 0;
              case KB_ENTER: /*_cursoron();*/ *x_menu = get_x_menuhori(menu, itemno + 1) ; return itemno + 1;
            }
                       
          }
        }
      }

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.