Rediriger des données venant du port série sur l'entrée clavier....

lecods Messages postés 6 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 19 octobre 2005 - 4 mai 2005 à 11:40
Jiminy138 Messages postés 1 Date d'inscription mercredi 18 juin 2008 Statut Membre Dernière intervention 18 juin 2008 - 18 juin 2008 à 10:22
Bonjour,

voila mon problème.
Lorsqu'on connecte un périphérique comme un lecteur de code à barre sur l'entrée clavier, lorsqu'on lit un code à barre, les données sont affichées dans word, notepad,......Elles sont donc affichées à l'écran.
Moi, je dois connecter un lecteur de carte sur le port série (COM1 ou COM2). Je récupère donc les données lues sur le port série et j'aimerai savoir comment les redirigé sur l'entrée clavier.
En fait je veux que les données lues sur le port série s'affiche dans word, notepad....Comme si mon lecteur était connecté sur l'entrée clavier.

j'espère avoir été clair.
merci.

11 réponses

jpthomasset Messages postés 95 Date d'inscription samedi 19 juin 2004 Statut Membre Dernière intervention 20 avril 2010
4 mai 2005 à 12:01
Salut,



Je ne vois pas trop l'interêt, mais je pense que SendInput est ce que tu cherche.

Par contre simuler des commandes claviers n'est pas terrible :
Qu'est-ce qu'il va se passer si la fenetre de Notepad ou word n'as pas
le focus: une autre application va recevoir les caractères.



A+,

JP.
0
lecods Messages postés 6 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 19 octobre 2005
4 mai 2005 à 12:23
merci pour la réponse.
alors l'intérêt n'est pas pour moi mais pour ma boite lol.
en fait les bibliothèques utilisent des logiciels de gestion de bibliothèque utilisant des lecteurs de codes à barre connecté sur le port clavier. Donc quand un code à barre est lu, l'info s'affiche dans la fenêtre du logiciel comme s'il avait été entré au clavier.
La technologie évoluant, il est possible maintenant d'identifier les produits par des tags.
Seulement mon lecteur de tags est connecté au PC sur le port série.
Le but est donc de prendre le logiciel de gestion de bibliothèque, connecté mon lecteur sur le port série et le logiciel doit pouvoir se comporter de la meme manière que si les données venait du lecteur de code à barre connecté sur l'entrée clavier.
D'ou la solution de développer une dll par exemple qui lit les infos remonté sur le port série et les envoyé au système comme si elle venait de l'entrée clavier.

a+
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
14 oct. 2005 à 11:23
Bonjour, si tu as réussi à faire appel à l'api SendInput(), je veux bien un exemple STP

David, à VERSAILLES
0
lecods Messages postés 6 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 19 octobre 2005
14 oct. 2005 à 16:07
Salut,
en fait j'ai finalement opté pour la fonction keybd_event
le 1er paramètre est le code virtuel associé à la touche que l'on trouve grace à la fonction VkKeyScan

Par exemple on a :

short sCar = 0;

sCar = VkKeyScan((TCHAR)(caractère));

l'octet de poids fort de sCar permet de savoir si une touche particulière comme le shift, ctrl,.... doit être enfoncé.
l'octet de poids faible contient le code virtuel de la touche

if ( (sCar & 0x0100) )
keybd_event( VK_SHIFT, 0, 0, 0); // on simule l'appui de la touche shift


if ( (sCar & 0x0200) )
keybd_event( VK_CONTROL, 0, 0, 0);


if ( (sCar & 0x0400) ) // VK_MENU = touche ALT
keybd_event( VK_MENU, 0, 0, 0);


keybd_event( (unsigned char)(sCar), 0, 0, 0); // on simule ici l'appui de la touche
keybd_event( (unsigned char)(sCar), 0, KEYEVENTF_KEYUP, 0); // on simule ici le relachement de la touche


if ( (sCar & 0x0100) )
keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);


if ( (sCar & 0x0200) )
keybd_event( VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);


if ( (sCar & 0x0400) ) // VK_MENU = touche ALT
keybd_event( VK_MENU, 0, KEYEVENTF_KEYUP, 0);


//pour simule un retour a la ligne
keybd_event( VK_RETURN, 0, 0, 0);
keybd_event( VK_RETURN, 0, KEYEVENTF_KEYUP, 0);

voila se code envoit à la fenêtre active un caractère suivi d'un retour à la ligne.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
17 oct. 2005 à 09:37
Bonjour Lecods,

Excellent ton code, il marche à merveille !

Juste un conseil final:
Comment sortir de la boucle proprement.
Je sortait de mon programme en apuyant sur une touche, mais comme on le simule, c'est foutu.
Voici mon code:
do {
temp = 0;
if(ReadCOM(buffer,sizeof(buffer)-1,&nBytesRead) && nBytesRead>0) { // recevoir des données
temp = 1;
buffer[nBytesRead] = '\0';
printf("\r%d octet(s) recu(s): %s",nBytesRead,buffer);
for (i=0;i<strlen(buffer)-1;i++) { // INPUT_KEYBOARD VkKeyScan MapVirtualKey ToAscii
sCar = VkKeyScan((TCHAR)(buffer[i]));
if ((sCar & 0x0100)) keybd_event(VK_SHIFT,0,0,0); // Shift
if ((sCar & 0x0200)) keybd_event(VK_CONTROL,0,0,0); // Ctrl
if ((sCar & 0x0400)) keybd_event(VK_MENU,0,0,0); // Alt
keybd_event((unsigned char)sCar,0,0,0); // Virtual-Key Codes
keybd_event((unsigned char)sCar,0,KEYEVENTF_KEYUP,0);
if ((sCar & 0x0400)) keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0); // Alt
if ((sCar & 0x0200)) keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); // Ctrl
if ((sCar & 0x0100)) keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0); // Shift
}
} // */
} while(!kbhit() || temp==0);

Mais ça ne marche pas, il faut appuyer sur une touche et repasser dans la condition pour sortir
En clair, comment nettoyer le buffer après le traitement ?

David, à VERSAILLES
0
lecods Messages postés 6 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 19 octobre 2005
18 oct. 2005 à 11:56
Salut,

j'ai peur de ne pas avoir bien compris.

concernant ton code.
dans ton while je rajouterai des parenthèses comme ca while ( !kbhit() || (temp==0) );

sinon je ne connaissais pas kbhit, j'ai cherché et en fait ca sert à savoir si une touche du clavier est enfoncé. Mais puisque tu simules un clavier vérifie que cette fonction te renvoit 1 lorsque tu simule l'appui d'une touche car si elle te renvoit tjrs 0 tu restes dans ton while quelque soit la valeur de temp et tu ne sors jamais.

voila j'espère avoir répondu à ta question
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
18 oct. 2005 à 15:23
Je voulais savoir si il y avait une fonction qui nettoyait le tampon clavier une fois le traitement du for terminé histoire de sortir de cette boucle en appuyant sur une touche.

David, à VERSAILLES
0
lecods Messages postés 6 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 19 octobre 2005
18 oct. 2005 à 16:18
heu alors ça je sais pas.
je pense que toutes les simulations clavier ont été envoyés et traiter dans le for.
le buffer doit être vide.

par contre j'ai fait un test avec ton code et lorsque j'appui sur une touche, kbhit() ne me retourne pas 1 et donc je reste ds la boucle indéfiniement.
j'ai juste fait une boucle sans le for et le readcom.
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
18 oct. 2005 à 16:22
Comment suggères tu de sortir de la boucle proprement alors...
As tu une autre solution, que l'appui d'une touche, aisée pour l'utilisateur ?

David, à VERSAILLES
0
lecods Messages postés 6 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 19 octobre 2005
19 oct. 2005 à 11:17
Salut,

as tu essayé les fonctions relatives au clavier qui permettent de connaitre l'état du clavier, l'état d'une touche,......
essaye avec GetKeyState, GetKeyboardState,....

tu devrais trouver des infos sur msndn
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/getkeystate.asp
0
Jiminy138 Messages postés 1 Date d'inscription mercredi 18 juin 2008 Statut Membre Dernière intervention 18 juin 2008
18 juin 2008 à 10:22
Salut,
C'est marrant, parce que j'ai pratiquement la même application à mettre en place. En fait, je cherche à remplacer des lecteurs code barre par des lecteurs RFID Siemens MobyD, avec connexion RS232.
Pour écrire le texte une fois l'information récupérée, j'ai préparé ce petit code:

#include<stdlib.h>
#include<stdio.h>
#include <string.h>
#include <windows.h>


int main()
{
int lenght;
int i;
char* string =  {"VP00045021011000000K"}; //ici, ce sera le code qui m'intéresse
Sleep(4000);  //pour l'exemple, permet d'avoir le temps de passer sous un Word ou notepad




lenght = strlen(string);
for (i=0;i<lenght;i++)
{
 keybd_event(VkKeyScan(string[i]), 0, 0, 0); //Enfoncement de la touche correspondant à la lettre à la position i
 keybd_event(VkKeyScan(string[i]), 0, KEYEVENTF_KEYUP, 0); //On "releve" la touche
};


system ("PAUSE");
return 0;
}

A signaler: il faut configurer le clavier en mode "anglais" (via les options de langue), sinon il y a des problèmes.

Par contre, ce qui me pose de gros problèmes maintenant, c'est de récupérer cette PUTAIN d'info depuis mon com port...
Si tu peux me donner des infos là dessus, je suis preneur.
0
Rejoignez-nous