ok, j'ai éssayé le WaitForSingleObject() juste apres un ShellExecuteEx(&ExecuteInfo),
memset(&ExecuteInfo, 0, sizeof(ExecuteInfo));
ExecuteInfo.cbSize = sizeof(ExecuteInfo);
ExecuteInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ExecuteInfo.hwnd = 0;
ExecuteInfo.lpVerb = "open";
ExecuteInfo.lpFile = "leprog";
ExecuteInfo.lpParameters = mes_parametres; //parametres pour leprog
ExecuteInfo.lpDirectory = 0;
ExecuteInfo.nShow = SW_SHOW;
ExecuteInfo.hInstApp = 0;
if(ShellExecuteEx(&ExecuteInfo) == FALSE)
{
// erreur
}else{}
DWORD test;
test = WaitForSingleObject(ExecuteInfo.hProcess,INFINITE);
if (test==WAIT_OBJECT_0 ) {
MessageBox(NULL,"Coucou signale","Boite coucou",MB_ICONEXCLAMATION|MB_OK|MB_TASKMODAL);
}else{}
Voila donc au debut quand j'ai ajouté WaitForSingleObject, je me suis aperçu que ExecuteInfo.hProcess n'était pas alimenté, je suis allé faire un tour dans l'aide, pour savoir comment était alimenté la structure SHELLEXECUTEINFO, et j'ai vu qu'il fallait spécifier le masque SEE_MASK_NOCLOSEPROCESS dans ExecuteInfo.fMask, pour avoir le handle du programme démarré par ShellExecuteEx ().
Ok en ayant fait tout ça j'ai aussi, paramétré INFINITE dans mon WaitForSingleObject() car je veux que ce programme leprog s'execute tant que je n'irai pas cliquer sur un bouton "Fermer" de mon application, qui simulera par exemple le clavier avec la pression de la touche "F4". Mais apparement WaitForSingleObject bien sur avec INFINITE devient bloquant, elle bloque mon application, j'en déduis qu'elle attend un chagement d'état de leprog. Ce qui me pose probleme, car à aucun momment je peux aller appuyer sur mon boutton "Fermer" puisque mon application est bloquée par WaitForSingleObject()
J'ai donc testé cette fonction pour voir ce qu'elle me retournait, en allant sélectionner la fenêtre et presser "F4" sur le clavier pour fermer leprog et elle me retourne un WAIT_OBJECT_0, qui signifie donc si j'ai bien lu la doc, que l'état de l'objet spécifié est signalé. Là bien sur mon application se débloque.
Ensuite j'ai essayé TerminateProcess(ExecuteInfo.hProcess, 0) le tout en pas-à-pas juste pour voir si ça fermait leprog :
memset(&ExecuteInfo, 0, sizeof(ExecuteInfo));
ExecuteInfo.cbSize = sizeof(ExecuteInfo);
ExecuteInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ExecuteInfo.hwnd = 0;
ExecuteInfo.lpVerb = "open";
ExecuteInfo.lpFile = "leprog";
ExecuteInfo.lpParameters = mes_parametres; // parametres pour leprog
ExecuteInfo.lpDirectory = 0;
ExecuteInfo.nShow = SW_SHOW;
ExecuteInfo.hInstApp = 0;
if(ShellExecuteEx(&ExecuteInfo) == FALSE)
{
// erreur
}else{}
TerminateProcess(ExecuteInfo.hProcess, 0); //on tente de fermer leprog
Resultat : ok ça le ferme, mais malheureusement je ne sais toujours pas si ça le ferme proprement.
En faisant comme tu m'a conseillé BruNews ça bloque au niveau du WaitForSingleObject, comme j'ai mis INFINITE, et je débloque le tout en allant moi même appuyer sur "F4" sur le clavier, de ce fait étant donné que leprog se ferme, je ne sais pas si l'appel de la fonction TerminateProcess() juste apres à un vraiment un effet étant donné que le prog est déjà fermé. Mais j'ai testé et je te donne les résultats, pour te donner une idée de la chose.
Y'aurais t-il un moyen d'intercepter, le message, ou le signal envoyé, quand j'appui sur "F4" sur mon clavier, dans la fenêtre de commandes de leprog ? (Je rappel que leprog est un programme que je ne peux pa modifier)
Si ça se trouve ce n'est peut-être pas le bon message que je lui envoi quand je fait mon :
PostMessage(Le_handle_de_la_fenetre,WM_KEYDOWN,VK_F4,0);
Ou tout simplement est-ce ma façon de simuler le clavier qui ne va pas ?
J'ai fait un éssai en lançant une fenêtre de commande au lieu de leprog, et elle reçoit bien la touche que j'ai simulé, ou est la différence ? c'est au niveau processus que ça se passe ? je n'agis peut-être pas au bon niveau ?
En tout cas merci pour vos réponses, si vous pouvez me décoincer, je suis toujours ouvert à toute propositions.
et merci aux courageux qui ont eut la patience de lire en entier ce post !! promis je tenterai de faire moins long, mais j'aime bien rentrer dans les détails
.
JAb