Newsgroup: it.comp.lang.c
Titolo: aiuto caratteri speciali

Ciao come devo fare per riconoscere quando è battuto un carattere speciale
come F1 o una delle frecce di direzione .
Mi spiego quando scrivo
c=getch();
se premo F... o una delle freccie ricevo come valore Ascii uno 0 (zero) come
devo fare per capire quale tasto è stato premuto ?
Ciao e grazie in anticipo.

(zero) come devo fare per capire quale tasto è stato premuto ?
Quando la getch() ritorna 0 significa che e' stato premuto un tasto
funzione. Devi quindi richiamare di nuovo la getch() ed avrai il
valore del tasto premuto. La seguente e' una piccola routine d'esempio
che legge solo alcuni caratteri : Escape, Invio, Up arrow, Page up,
Left arrow, Right arrow, Down arrow e Page down.
In questo caso chi chiama la subroutine getkey() non puo' confondere i
tasti normali con i tasti funzione in quanto ne vengono accettati solo
alcuni. Se tu dovessi accettare tutti i caratteri potresti sempre
aggiungere un 1000 quando e' un tasto funzione (nella seconda return).
Avresti cosi' da 1 a 255 per i valori ASCII normali e da 1000 in poi
per i tasti funzione.
int getkey()
  {
  int ascii;
  while (1)
    {
    ascii = getch();
    if ( (ascii == 13) || (ascii == 27) )
      {
      return (ascii);
      }
    if (ascii == 0)
      {
      ascii = getch();
      if ( (ascii == 72) || (ascii == 73) ||
        (ascii == 75) || (ascii == 77) ||
        (ascii == 80) || (ascii == 81) )
        {
        return (ascii);
        }
      }
    }
  }

 Ciao e grazie in anticipo.
In MS-DOS i tasti speciali vengono ritornati dalla getch() di Conio.h
(BorlandC) in due letture dove nella prima la funzione ritorna 0 come tu hai
gia' notato, nella seconda ritorna lo "scancode" del tasto cioe' il codice
del tasto prima che venga convertito secondo il layout di tastiera. Lo
scancode e' un intero con valore da 0 a 255.
Puoi usare questa semplice tecnica:
int  getkey ( void )
{
   int c=getch();
   if( c )     return c;  // e' un carattere ascii cioe' ha valore max 255
   return 0x100+getch();  // e' un carattere speciale rimappato da 256 in
su'
}
poi usa le seguenti definizioni per i tasti speciali:
#define ESCAPE      0x01B
#define LF          0x00A
#define ENTER       0x00D
#define RETURN      0x00D
#define BACKSP      0x008
#define DELETE      0x153
#define INSERT      0x152
#define HOME        0x147
#define END         0x14F
#define PGUP        0x149
#define PGDN        0x151
#define UPARR       0x148
#define DNARR       0x150
#define RIGHTARR    0x14D
#define LEFTARR     0x14B
#define TAB         0x009
#define SHFT_TAB    0x10F
#define CTRL_DELETE 0x193
#define CTRL_INSERT 0x192
#define CTRL_PGUP   0x184
#define CTRL_PGDN   0x176
#define CTRL_UPARR  0x18D
#define CTRL_DNARR  0x191
#define CTRL_LEFT   0x173
#define CTRL_RIGHT  0x174
#define CTRL_HOME   0x177
#define CTRL_END    0x175
#define CTRL_PAD5   0x18F
#define CTRL_RETURN 0x00A
#define CTRL_ENTER  0x00A
#define CTRL_ESCAPE 0x01B
#define CTRL_TAB    0x194
#define ALT_TAB     0x1A5
#define ALT_ESCAPE  0x101
#define ALT_ENTER   0x11C
#define ALT_RETURN  0x11C
#define ALT_BACKSP  0x10E
#define CTRL_A      0x001
#define CTRL_B      0x002
#define CTRL_C      0x003
#define CTRL_D      0x004
#define CTRL_E      0x005
#define CTRL_F      0x006
#define CTRL_G      0x007
#define CTRL_H      0x008
#define CTRL_I      0x009
#define CTRL_J      0x00A
#define CTRL_K      0x00B
#define CTRL_L      0x00C
#define CTRL_M      0x00D
#define CTRL_N      0x00E
#define CTRL_O      0x00F
#define CTRL_P      0x010
#define CTRL_Q      0x011
#define CTRL_R      0x012
#define CTRL_S      0x013
#define CTRL_T      0x014
#define CTRL_U      0x015
#define CTRL_V      0x016
#define CTRL_W      0x017
#define CTRL_X      0x018
#define CTRL_Y      0x019
#define CTRL_Z      0x01A
#define ALT_1       0x178
#define ALT_2       0x179
#define ALT_3       0x17A
#define ALT_4       0x17B
#define ALT_5       0x17C
#define ALT_6       0x17D
#define ALT_7       0x17E
#define ALT_8       0x17F
#define ALT_9       0x180
#define ALT_0       0x181
#define ALT_A       0x11E
#define ALT_B       0x11F
#define ALT_C       0x120
#define ALT_D       0x121
#define ALT_E       0x122
#define ALT_F       0x123
#define ALT_G       0x124
#define ALT_H       0x125
#define ALT_I       0x126
#define ALT_J       0x127
#define ALT_K       0x128
#define ALT_L       0x129
#define ALT_M       0x12A
#define ALT_N       0x12B
#define ALT_O       0x12C
#define ALT_P       0x12D
#define ALT_Q       0x12E
#define ALT_R       0x12F
#define ALT_S       0x130
#define ALT_T       0x131
#define ALT_U       0x132
#define ALT_V       0x133
#define ALT_W       0x134
#define ALT_X       0x135
#define ALT_Y       0x136
#define ALT_Z       0x137
#define F1          0x13B
#define F2          0x13C
#define F3          0x13D
#define F4          0x13E
#define F5          0x13F
#define F6          0x140
#define F7          0x141
#define F8          0x142
#define F9          0x143
#define F10         0x144
#define F11         0x185
#define F12         0x186
#define SHIFT_F1    0x154
#define SHIFT_F2    0x155
#define SHIFT_F3    0x156
#define SHIFT_F4    0x157
#define SHIFT_F5    0x158
#define SHIFT_F6    0x159
#define SHIFT_F7    0x15A
#define SHIFT_F8    0x15B
#define SHIFT_F9    0x15C
#define SHIFT_F10   0x15D
#define SHIFT_F11   0x187
#define SHIFT_F12   0x188
#define CTRL_F1     0x15E
#define CTRL_F2     0x15F
#define CTRL_F3     0x160
#define CTRL_F4     0x161
#define CTRL_F5     0x162
#define CTRL_F6     0x163
#define CTRL_F7     0x164
#define CTRL_F8     0x165
#define CTRL_F9     0x166
#define CTRL_F10    0x167
#define CTRL_F11    0x189
#define CTRL_F12    0x18A
#define ALT_F1      0x168
#define ALT_F2      0x169
#define ALT_F3      0x16A
#define ALT_F4      0x16B
#define ALT_F5      0x16C
#define ALT_F6      0x16D
#define ALT_F7      0x16E
#define ALT_F8      0x16F
#define ALT_F9      0x170
#define ALT_F10     0x171
#define ALT_F11     0x18B
#define ALT_F12     0x18C
spero di essere stato utile..
ciao
donCiccio