Comment transmettre un code de type ctrl + touche sur des pipes via Writefile. [Résolu]

Signaler
Messages postés
86
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
18 juillet 2009
-
Messages postés
86
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
18 juillet 2009
-
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

Messages postés
86
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
18 juillet 2009

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.
Messages postés
86
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
18 juillet 2009

Ca revient en fait à générer un évènement de type ctrl via WriteFile. Si c'est possible comment faire.
Messages postés
86
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
18 juillet 2009

WriteFile(hChildStdinWr, (DWORD *)0x02E03, sizeof(0x02E03), &dwWritten, NULL); ne marche pas. 0x02E03 est le scan code correspondant à ctrl+c.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
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
Messages postés
86
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
18 juillet 2009

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)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Tu a écrit quoi exactement? Ni (DWORD)0x02E03 ni (DWORD*)0x02E03 ne convient

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
86
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
18 juillet 2009

Euh, (LPCVOID)(DWORD)...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Ca risque pas de marcher non plus alors

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
86
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
18 juillet 2009

Non non, ce que j'ai écrit dans le code c'est ce que t'as écrit...
Messages postés
86
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
18 juillet 2009

Mais je vois pas comment l'écrire en abrégé... sans la variable DWORD
Messages postés
86
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
18 juillet 2009

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.