lancer un .exe existant depuis C++ et simuler une frappe dans celui ci

lancer un .exe existant depuis C++ et simuler une frappe dans celui ci - Programmation

Marsh Posté le 26-03-2001 à 17:08:37    

Je m'explique :  
Je programme une appli en C++ chargée entre autre de rendre "conviviale" un vieux programme lourd en paramètres pour l'utilisateur. Aussi je voudrais faire lancer le vieux prg par C++, lui faire executer des séquences de touches passée par C++ comme si elles étaient tapées à l'interieur du vieux prg, le fermer et continuer le déroulement normale du prg en C++. Est ce possible ? Quelles sont les fonctions a utiliser ?
Merci d'avance...

Reply

Marsh Posté le 26-03-2001 à 17:08:37   

Reply

Marsh Posté le 26-03-2001 à 18:44:03    

Voilà comment lancer un exe à partir de ton programme C (MFC) :
 
PROCESS_INFORMATION Process = {0};
STARTUPINFO Start = {0};
Start.cb = sizeof(STARTUPINFO);
Start.lpReserved = NULL;
Start.lpReserved2 = NULL;
Start.cbReserved2 = 0;
Start.lpDesktop = NULL;
Start.dwFlags = 0;
 
// Lance process
int ReturnProcess = CreateProcess(NULL, _T("ton exe" ), NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &Start, &Process);
 
// Vérifie si l'opération s'est bien déroulée
if (ReturnProcess == 0)
          MessageBox("Erreur, impossible to run Process !", "Erreur", MB_OK + MB_ICONEXCLAMATION);
 
Ensuite tu peux attendre que le programme "client" ait terminé son job en vérifiant à intervalle régulier :
 
DWORD ReturnValue = WaitForSingleObject(Process.hProcess, 0);
 
Regarde l'aide cette fonction, tu peux spécifier un certain temps ou attendre jusqu'à ce qu'il ait terminé (INFINITE) si je me rappelle bien.
Quand ReturnValue = 0, le programme lancé est terminé.
 
Pour envoyer tes séquences de touches dans le programme tu peux employer plusieurs méthodes : l'une serait de simuler l'appui sur le clavier ou la souris (keybd_event et mouse_event).  Cherche dans la doc.
Si tu trouves pas je te filerai quelques exemples.
Il y a peut être une méthode "plus propre" en récupérant le handle de l'appli. et en envoyant directement dans sa boucle de message les touches en question ...
 
@+
Flying

Reply

Marsh Posté le 28-03-2001 à 22:21:18    

Merci beaucoup !
Je cherche, je teste et j'espere y arriver...
A+

Reply

Marsh Posté le 29-03-2001 à 00:38:28    

Je suis aussi très intéressé par ce procédé, j'ai essayé, ça marche très bien lorsqu'on execute un simple programme, sans paramètre particulier, mais comment fait-on si il s'agit d'une application DOS, par exemple, à laquelle on doit fournir des paramètres. J'ai essayé, mais ça ne marche pas ????

Reply

Marsh Posté le 29-03-2001 à 00:45:24    

le premier parametre de CreateProcess est ton executable ( avec le chemin) et le second parametre est une chaine de caractere contenant tous les parametres.
 
exemple CreateProcess("c:\windows\command\format.com","c:", ...);

Reply

Marsh Posté le 29-03-2001 à 01:05:07    

Moi je mets tout dans le premier paramètre (exe et paramètres) et cela fonctionne très bien aussi.
 
@+
Flying

Reply

Marsh Posté le 29-03-2001 à 01:09:07    

OK, c'est cool, ça répond en fait a une partie de ma question... Ce que j'aurai dû précisé (désolé), c'est que je ne connais pas d'avance la chaine de caractères a mettre, cela dépend de l'utilisateur, c'est-à-dire que l'utilisateur va spécifier telle ou telle valeur, et ensuite le programme doit être envoyé avec ces valeurs, donc j'aurai une chaine a inséré de la forme : "%d %s %d",valeur1,valeur2,valeur3, etc... Et je ne vois pas trop comment faire ???

Reply

Marsh Posté le 29-03-2001 à 01:15:17    

Le plus simple c'est de repérer la position des cases ou tu dois entrer les données, ensuite tu clikes dessus et tu "envoies" ta donnée en simulant l'appui sur les touches.  Mais cela exige que le programme soit lancé toujours à la même place à l'écran, même résolution et que l'utilisateur ne "s'amuse" pas avec la souris pendant que le programme s'exécute !
Sinon il doit y avoir moyen de trouver un pointeur sur la Message Pump de l'appli. et de lui injecter directo les séquences, genre (TAB TAB donnée1 TAB donnée2 etc ...) enfin je sais pas à quoi ressemble l'application en question ...
 
@+
Flying

Reply

Marsh Posté le 29-03-2001 à 02:28:58    

La vache... que d'infos. Déjà je voulais te dire merci beaucoup pour tout ce que tu m'as expliqué et appris (mine de rien, j'ai pas mal progressé sur mon prog ce soir ;-)), y'a peu de gens sympa comme toi sur ce forum, alors merci (c'est une fonction que je cherchais vraiment depuis longtemps...). Sinon, pour la gestion des entrèes utilisateurs, ça marche, une chose de moins ;-). Si je peux me permettre, j'aimerais te poser une dernière question (et j'irai me coucher après, j'en ai plein la tête ;-)) : Comment faire pour ne pas faire apparaître la fenêtre DOS (c'est jamais très beau...) ???

Reply

Marsh Posté le 29-03-2001 à 08:30:41    

Qu'est ce que tu entends par "ne pas faire apparaître la fenêtre DOS" ?
 
Flying

Reply

Marsh Posté le 29-03-2001 à 08:30:41   

Reply

Marsh Posté le 29-03-2001 à 11:38:22    

Ben, tu vois, quand tu lances l'application DOS, celle-ci travaille pendant un certain temps et ça m'affiche une fenêtre DOS avec l'application lancée et tout ce qu'elle fait... ça fait toujours ça quand t'envoie un prog qui tourne sous DOS ;-). Alors je sais que la fonction WinExec est en fait une forme simplifiée qui utilise CreateProcess, mais avec WinExec tu as SW_SHOW ou SW_HIDE (WinExec("le prog", SW_HIDE)) pour voir, ou ne pas voir l'application lancé, donc comme cette fonction est une dérivée de CreateProcess, je pense qu'il doit y avoir possibilité, avec CreateProcess, de masquer de la même manière l'application lancée ? Non ?

Reply

Marsh Posté le 29-03-2001 à 15:47:16    

Tu voudrais donc que ton application (application console?) ne soit pas visible c'est bien ca ?
 
 
Flying

Reply

Marsh Posté le 29-03-2001 à 17:36:02    

ça doit être ça... De toute façon, l'utilisateur indique dans l'interface les paramètres qu'il veut, clique sur un bouton pour envoyer le prog DOS, mais il n'a pas besoin de savoir ce qui se passe, et à la fin une boîte de dialogue s'ouvre du genre "Traitement terminé". Tu vois, comme une petite interface pour compresser des fichiers, et qui utiliserait pkzip sous DOS, mais sans afficher ce qu'il fait ;-).

Reply

Marsh Posté le 29-03-2001 à 23:12:33    

et faire tout ça en C tout simple, c'est possible ???


---------------
I'm the POPOV masqué !!   ;)
Reply

Sujets relatifs:

Leave a Replay

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