Comment transmettre un code de type ctrl + touche sur des pipes via Writefile.

Résolu
Sim 2005 Messages postés 86 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 18 juillet 2009 - 31 juil. 2007 à 17:34
Sim 2005 Messages postés 86 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 18 juillet 2009 - 31 juil. 2007 à 23:23
J'utilise des pipes pour rediriger les entrées/sorties d'un programme console vers un programme hôte, et j'aimerais pouvoir envoyer des evenements de type ctrl+c. Pour écrire sur l'entrée du programme console, j'utilise Writefile. Comment trouver ce qu'il faut mettre dans le buffer pour envoyer ce message? j'ai essayé sendmessage et keybd_event avec le handle de l'application mais ça ne fonctionne pas comme les entrées sont redirigées.
Il faut donc utiliser WriteFile, et l'argument qui contient le message à envoyer sur la console estun buffer de type BYTE.
Il me faudrait donc savoir à quels bytes correspondent tel ou tel évenement clavier. ctrl + break....
Merci

11 réponses

Sim 2005 Messages postés 86 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 18 juillet 2009
31 juil. 2007 à 19:46
La solution est d'utiliser GenerateConsoleCtrlEvent(CTRL_C_EVENT, Id du process) avec un procesus créé avec CREATE_NEW_PROCESS_GROUP. Cependant un bug de windows (reconnu) fait que ce message n'est pas traité. CTR_BREAK_EVENT marche mais il ne fonctionne pas comme ctr c.
3
Sim 2005 Messages postés 86 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 18 juillet 2009
31 juil. 2007 à 18:14
Ca revient en fait à générer un évènement de type ctrl via WriteFile. Si c'est possible comment faire.
0
Sim 2005 Messages postés 86 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 18 juillet 2009
31 juil. 2007 à 18:35
WriteFile(hChildStdinWr, (DWORD *)0x02E03, sizeof(0x02E03), &dwWritten, NULL); ne marche pas. 0x02E03 est le scan code correspondant à ctrl+c.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
31 juil. 2007 à 21:54
WriteFile(hChildStdinWr, (DWORD *)0x02E03, sizeof(0x02E03),
&dwWritten, NULL);

Normal que ca ne marche pas, 0x02E03 n'est pas une adresse valide. Il faut faire ceci:

DWORD dwCode = 0x02E03;
WriteFile(hChildStdinWr, &dwCode, sizeof dwCode,
&dwWritten, NULL);

_____________________________________
Un éditeur de ressources gratuit pour Windows
0

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

Posez votre question
Sim 2005 Messages postés 86 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 18 juillet 2009
31 juil. 2007 à 22:50
En réalité c'est ce que j'ai fait, mais pour simplifier dans le post j'ai écrit


WriteFile(hChildStdinWr, (DWORD)0x02E03, sizeof(0x02E03), &dwWritten, NULL) le * au niveau de DWORD est à enlever, il ne s'agit pas d'une adresse en effet. (Trop de précipitation)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
31 juil. 2007 à 22:52
Tu a écrit quoi exactement? Ni (DWORD)0x02E03 ni (DWORD*)0x02E03 ne convient

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
Sim 2005 Messages postés 86 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 18 juillet 2009
31 juil. 2007 à 22:58
Euh, (LPCVOID)(DWORD)...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
31 juil. 2007 à 23:03
Ca risque pas de marcher non plus alors

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
Sim 2005 Messages postés 86 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 18 juillet 2009
31 juil. 2007 à 23:14
Non non, ce que j'ai écrit dans le code c'est ce que t'as écrit...
0
Sim 2005 Messages postés 86 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 18 juillet 2009
31 juil. 2007 à 23:20
Mais je vois pas comment l'écrire en abrégé... sans la variable DWORD
0
Sim 2005 Messages postés 86 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 18 juillet 2009
31 juil. 2007 à 23:23
J'ai écrit un truc de ce style là,
DWORD dwCode = 0x02E03;
WriteFile(hChildStdinWr, &dwCode, sizeof dwCode, &dwWritten, NULL);

mais la confusion vient du fait que lors de l'écriture du post, j'ai remplacé le dwCode par 0x023 directement.
0
Rejoignez-nous