PDA

Visualizza versione completa : [C] Catturare la pressione di alcuni tasti


Alhazred
05-12-2007, 16.00.53
Mi serve catturare la pressione di alcuni tasti in modo da annullarne l'effetto.
Con alcuni ci riesco ma ce ne sono altri che non vogliono saperne di essere intercettati.
Potete leggere il codice della funzione qui (http://www.lacasa.altervista.org/software/userinput.txt) (forse incollado l'indirizzo nella barra degli indirizzi).

Avete idee sul perché vengano ignorati i casi indicati nel codice? Premendo i relativi tasti ottengo come output cose del tipo òR, òI, òQ...

Sergio Neddi
05-12-2007, 23.24.10
Quelli sono tasti speciali che riportano sequenze di 2 caratteri ad ogni pressione.

Alhazred
06-12-2007, 13.24.11
Lo so, così come i tasti funzione che vengono catturati dal case 0:
Il problema è che non vengono catturati, né usando il corrispondente nome virtuale (VK_INSERT etc.) né usando i corrispettivi ascii (45 per ins etc.).
Come faccio a farglieli catturare?

LoryOne
06-12-2007, 21.42.39
Ti propongo un piccolo esempio esplicativo debitamente commentato che altro non è che lo scheletro di una funzione molto semplice ma completa sul riconoscimento della pressione di un tasto, dell' acquisizione di un range di ASCIICode, della verifica della restituzione dello ScanCode e la sua eventuale l'eliminazione dal buffer della tastiera.


char *UserInput(int);

char *UserInput(int max){
char c,*Buff;
short int i=0,j=0,vmin,vmax;

Buff=(char*)malloc(max+1);
while(c!=13 || i<2){ // Mai invio a vuoto.
// Sempre almeno una lettera ed un numero
switch(j){
case 0:vmin='A';vmax='J';break; // Lettere vailde A..J
case 1:vmin='0';vmax='9'; // Cifre valide 0..9
}
c=toupper(getch());
if(c==0||c==-32) getch(); // Elimina lo scan code, ossia
// carico il succ. carattere dal buffer
switch(c){
case 8: // Backspace
if(i>0){
i--; if(i==0) j=0;
printf("\b%c\b",255);
}break;
default:
if((c>=vmin && c<=vmax) && i<max){
printf("%c",c);
Buff[i]=c;
i++; j=1;
}
}
}Buff[i]='\0'; // Aggiungo il terminatore di stringa
return Buff;
}

main(void){
char *s;
printf("Immetti una lettera compresa tra 'A' e 'J' ed un numero:");
s=UserInput(2);
printf("\nHai immesso:%s",s);
getch();
}

Alhazred
07-12-2007, 00.06.28
Ciao Lory, ho letto adesso al volo il tuo codice ed ho avuto l'illuminazione di mettere un
case -32: getch(); break;
adesso tutti quei tasti che volevo disabilitare sono disabilitati.
Domani con la mente un po' più fresca guarderò meglio il codice che hai proposto, intanto ti faccio una domanda: perché VK_INSERT non mi catturava la pressione del tasto ins, mentre ad esempio VK_ESCAPE mi catturava esc, VK_RETURN mi catturava invio e VK_BACK mi catturava backspace?