| |||||
| Dernière réponse | |
|---|---|
| Sujet : [C] Comment detecter le SHIFT ? | |
| Carbon_14 | Exemple de la bible PC partiel, à adapter au besoin (merci M. Tischer..).
//INT 16H Fonction 02 : Teste l'?tat de certaines touches et modes d'entr?e // Appel avec 2 dans le registre AH, ?tat clavier retourn? dans AL // Bit 0 : Touche SHIFT de droite actionn?e // Bit 1 : Touche SHIFT de gauche actionn?e // Bits 2, 3 ? 7 : CTRL, ALT, Scroll Lock, Num Lock, Caps Lock, Insert // INT 16H Fonction 1 : teste le clavier sans retirer du buffer le caract?re // INT 16H Fonction 0 : si un caract?re dans le buffer clavier, il est retir? pour ?tre transmis au prog // sinon attend qu'un caract?re soit entr? et rends alors la main au prog d'appel #include <dos.h> #include <stdio.h> #define CR 13 #define F1 315 #define VRAI 1 #define FAUX 0 void IniKey(void); unsigned int GetKey(void); int KeyReady(void); void main() { unsigned long Touche; printf("CLAVIER M. Tischer, LA BIBLE PC, Micro-Applications 1989\n\n" ); IniKey(); do { Touche = GetKey(); if (Touche < 256) // lire touche printf("%c", (char)Touche); // sortir si normal } while (!(Touche == CR || Touche == F1)); printf("\n" ); } void IniKey(void) { // Initialise les flags clavier (purge ?tat d'avant) union REGS Register; Register.h.ah = 2; int86(0x16, &Register, &Register); // INT clavier du BIOS } unsigned int GetKey(void) { // Lire un caract?re et sortir l'?tat du flag // Retourne : < 256 si touche normale // >= 256 si touche ?tendue // union REGS Register; do { Register.h.ah = 2; int86(0x16, &Register, &Register); if (Register.h.al & 2) // 1 : SHIFT DROIT, 2 : SHIFT GAUCHE, 4 : CTRL printf("SHIFT\n" ); } while (! KeyReady()); // R?p?te jusqu'? touche pr?te Register.h.ah = 0; // num?ro fonction pour lire touche int86(0x16, &Register, &Register); return ((Register.h.al) ? Register.h.al : Register.h.ah | 256); } int KeyReady(void) { // Examine si une touche clavier est pr?te // Retourne TRUE si oui, sinon FALSE #ifdef __TURBOC__ struct REGPACK Register; Register.r_ax = 1 << 8; // num de fonction : touche pr?te ? intr(0x16, &Register); // INT clavier du BIOS return (!(Register.r_flags & 64)); // Renvoyer le flag z?ro #else return (_bios_keybrd(_KEYBRD_READY)); #endif } Dans l'aide BorlandC DOS, y a un exemple pour la fonction _bios_keybrd() qui semble "encpsuler" l'INT 16H. Si pas trouvable, je peux l'envoyer. Pour les applis DOS invendables, j'en ai acheté une dernièrement : System Commander pour faire du Multi-Boot. Courage, ça se vend encore :D ! |
| Vue Rapide de la discussion |
|---|