Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1047 connectés 

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°20538
chin jo
Posté le 26-03-2001 à 17:08:37  profilanswer
 

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...

mood
Publicité
Posté le 26-03-2001 à 17:08:37  profilanswer
 

n°20566
Flying
Posté le 26-03-2001 à 18:44:03  profilanswer
 

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

n°21187
chin jo
Posté le 28-03-2001 à 22:21:18  profilanswer
 

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

n°21202
Kalli
Posté le 29-03-2001 à 00:38:28  profilanswer
 

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 ????

n°21203
xilebo
noone
Posté le 29-03-2001 à 00:45:24  profilanswer
 

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:", ...);

n°21206
Flying
Posté le 29-03-2001 à 01:05:07  profilanswer
 

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

n°21208
Kalli
Posté le 29-03-2001 à 01:09:07  profilanswer
 

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 ???

n°21209
Flying
Posté le 29-03-2001 à 01:15:17  profilanswer
 

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

n°21215
Kalli
Posté le 29-03-2001 à 02:28:58  profilanswer
 

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...) ???

n°21222
Flying
Posté le 29-03-2001 à 08:30:41  profilanswer
 

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

mood
Publicité
Posté le 29-03-2001 à 08:30:41  profilanswer
 

n°21267
Kalli
Posté le 29-03-2001 à 11:38:22  profilanswer
 

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 ?

n°21344
Flying
Posté le 29-03-2001 à 15:47:16  profilanswer
 

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

n°21370
Kalli
Posté le 29-03-2001 à 17:36:02  profilanswer
 

ç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 ;-).

n°21422
thegnlpopo​v
Posté le 29-03-2001 à 23:12:33  profilanswer
 

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


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

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

 

Sujets relatifs
Comment simuler ds un fichier .bat la pression des touches du clavier[C++]Simuler un click?
Lancer des Fonctions Stockées sur SQL Server depuis VB ?[VC++] Comment simuler un appui sur le bouton g de la souris
Windows : comment interdire de lancer 2 fois un prog (en C ou autre)autorun pour lancer une page HTML?
asp: Simuler le global.asaComment ouvrir un fichier existant en écriture en Java ?
[HTML] lancer un telechargement 
Plus de sujets relatifs à : lancer un .exe existant depuis C++ et simuler une frappe dans celui ci


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR