[C] Comment detecter le SHIFT ?

Comment detecter le SHIFT ? [C] - Programmation

Marsh Posté le 22-01-2002 à 15:38:52    

Ben voila, tout est dans la question, je cherche à récupérer n'importe quoi (un caractere, une chaîne, un code ascii) par une saisie sur le pavé numérique, le but etant d'arriver à incrémenter quand la touche est pressee normalement, et decrementer quand l'utilisateur appuie sur [shift]+ [touche]
 
Et la, j'en ai vraiment ma claque de l'aide de turboC...  :heink:  
 
Merci de vos reponses...

Reply

Marsh Posté le 22-01-2002 à 15:38:52   

Reply

Marsh Posté le 23-01-2002 à 09:35:09    

J'avais écrit une fonction pour CTRL et pour SHIFT, C Windows 16 (et 32 bits)
 
BOOL MAJUS(void)
{
// retourne TRUE si touche MAJUSCULE enfoncée
//          FALSE sinon
 
    int MAJ;
 
    MAJ = GetKeyState(VK_SHIFT);  
 
    return ((MAJ & 128) == 128);
}
// fin module MAJUS
 
Le problème est sous DOS ou Windows ??

Reply

Marsh Posté le 23-01-2002 à 11:16:19    

Le pb est sous DOS avec TurboC 3.0... On ne rit pas, c impose par l'ecole....  :(  
 
parce que la, GetKeyState m'interesse bien, mais pô moyen...
 
Merci  :jap:

Reply

Marsh Posté le 23-01-2002 à 11:33:52    

C'est ce que je craignais. TurboC, il me semblait bien que c'était sous DOS (j'ai commandé directement avec Borland C => BC DOS, BCW Windows, TASM, etc...).
 
Faut que je regarde dans la Bible PC ce soir si j'oublie pas.
 
Le DOS n'a rien de honteux, j'utilise toujours. Les commandes en lignes avec | entre processus, ça peut être TRES efficace.
 
J'ai pioché dans un ancien prog que j'avais écrit en C (QB -> C en un week-end fin 1993 pour me "faire la main" car je débutais), sais pas si utilisable : fonction pour retourner le numéro de touche de fonction (F1, .., F10). Peut-être transposable (faut voir ce qui retourne pour MAJ, CTRL, ..)
 
int TouchFonktion(void)
{
  int    c, extended;
 
  if (kbhit())
     {
     if (!(c=getch()))  /* #0 si caract?re normal, 0 si caract?re ?tendu */
     extended=(c==0)?getch():0;
     }
  return (extended);
}
 
case 59:       /* F1:*/
case 68:        /* F10: */

Reply

Marsh Posté le 23-01-2002 à 11:35:22    

tistou a écrit a écrit :

Le pb est sous DOS avec TurboC 3.0... On ne rit pas, c impose par l'ecole....  :(  
 
parce que la, GetKeyState m'interesse bien, mais pô moyen...
 
Merci  :jap:  




 
Les enseignants sont vraiement des cons ! on m'a fait le même coup à moi ! programmer sous Dos, aujourd'hui, ms c ridicule. Je m'demande si ils vont continuer pareil dans 10 ans. Tu vas voir tistou, qd tu vas passer ss windows... le rêve !

Reply

Marsh Posté le 23-01-2002 à 11:53:44    

:non: Les enseignants sont pas des cons...
Mais viens enseigner dans un IUT (ou ailleurs) c'est pas complique : tu arrives, prend connaissance du matériel et logiciels disponibles et t'organises en consequence. Et si c des 8086 avec win 3.0 ? Ben faut faire avec... (euh... c pas ca quand meme, c juste un exple  :D )
 
carbon => merci, je compile et te tiens au courant...

Reply

Marsh Posté le 23-01-2002 à 12:34:27    

tistou a écrit a écrit :

:non: Les enseignants sont pas des cons...
Mais viens enseigner dans un IUT (ou ailleurs) c'est pas complique : tu arrives, prend connaissance du matériel et logiciels disponibles et t'organises en consequence. Et si c des 8086 avec win 3.0 ? Ben faut faire avec... (euh... c pas ca quand meme, c juste un exple  :D )
 
carbon => merci, je compile et te tiens au courant...  




 
C vrai... pas les enseignants (du moins pas tous, parce que g connu des bons cons, dans les profs aussi :D)
Mais les IUT en général, ils sont pauvres et ont du matos tout pourrit: pour dire, moi à mon IUT info on avait pas internet (ou juste sur 2 postes)... dans un IUT info, c qd même une honte !
J'avais jammais programmé ss windows, alors que plus aucune boite ne programme ss dos... c invendable un prog ss dos, les gens veulent ds trucs jolis maintenant, c normal. On a JAMMAIS utilisé une bibliothèque, alors que plein de trucs ne sont plus à refaire aujourd'hui. etc, etc...

Reply

Marsh Posté le 23-01-2002 à 12:41:14    

Faut bien commencer par les "bases" pour voir après ce qu'on peut faire en plus "sophistiqué".
 
A mon époque (école de chimie), on utilisait des bandes perforées. Les 4 opérations en assembleur sur des "grands nombres", galère à programmer. Quand on passe sur un système plus mieux (disquettes 8 pouces), ces opérations sont microcodées. Quel luxe...
 
Les gens qui utilisent des calculatrices sophistiquées pour faire des calculs de math, mais qui ne savent pas de quoi il retourne sont dans la mouise quand ils se trouvent dans un cas trop particulier. La machine sait pas, moi non plus (ça devrait être l'inverse, normalement :D).
 
Le DOS a des avantages, mais il faut se coltiner pas mal de INT machin pour faire ci, ça. Sur un 8086, Windows 3.0 en N/B passe mais on peut rien faire avec. :D  :D

Reply

Marsh Posté le 23-01-2002 à 14:45:04    

mmm...des bandes perforees.... Carbon 14, toi tu dois avoir 18 ans pas plus ?   ;)  
De nos jours on évoque les bandes perforees en cours d'archi/systemes, entre l'ENIAC et le premier 8088....  :D  
 
El_Gringo => c vrai que vendre un programme sous DOS de nos jours, faut se lever tot
 
et pr mon pb le coup des touches F1 F10 est pas mal, mais je peux pas l'appliquer car F1-F10 renvoient qqchose a getch alors que shift, nada. sur le pavé numerique, [1] ou [shift]+[1] c pareil pour cette babasse....  :(  
pourtant il doit y avoir un truc...

Reply

Marsh Posté le 23-01-2002 à 16:17:53    

Je tâche de voir ça dans mes grimoires ce soir (écrits à la plume d'oie par des moines programmeurs :)).
 
Qui veut des cartes perforées ? Une ligne de code par carte (FORTRAN). Qui n'en veut ?

Reply

Marsh Posté le 23-01-2002 à 16:17:53   

Reply

Marsh Posté le 24-01-2002 à 10:58:48    

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 !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed