Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : "Petit" problemme de HANDLE [ Archives / Au secours ] (Jab_834)

dimanche 6 février 2005 à 21:55:49 | "Petit" problemme de HANDLE

Jab_834

Membre Club

Bonjour a tous !

Alor voilà mon probleme, j'ai dans mon application , écrit une fonction permettant de lancer un autre programme externe, que je n'ai pas développé.

A l'aide de la fonction ShellExecuteEx(), jusque là, ça vas, maintenant le programme externe en question se lance de lui même en mode console (fenêtre de cmd msdos), et pour l'arrêter il suffit de sélectionner sa fenêtre et de presser "F4" sur le clavier.

Je n'arrive pas à récupérer le handle de cette fenêtre par son nom exact, qui a mon avis est trop long ou peut-être mal formaté je ne sais pas (je precise au passage que ce programme externe est prévu pour tourner aussi bien sous Linux que sous Windows peut-être que le probleme du nom de la fenêtre vient de là, je suis sous Windows XP)....
bon j'arrive quand même a récupérer son handle, par sa classe,

la classe "ConsoleWindowClass" en faisant : FindWindow("ConsoleWindowClass",NULL),

ok, là j'ai son handle et je met la fenêtre au premier plan

par un SetForegroundWindow(Le_handle_de_la_fenetre), là toujours pas de problème, la

fenêtre se met bien au premier plan, et elle est bien sélectionnée.

Maintenant, je veux simuler la pression de la touche "F4" du clavier, et là problème !!

en faisant dans mon application :

PostMessage (Le_handle_de_la_fenetre,WM_KEYDOWN,VK_F4,0), il n'y à aucun effet ! il ne se ferme pas !

J'ai un moyen de le fermer quand même en faisant celà :

PostMessage (Le_handle_de_la_fenetre,WM_CLOSE,0,0) , mais en faisant celà je n'ai aucune certitude que le programme en question se termine proprement !

Voilà donc mon probleme pour résumer, je n'arrive pas à fermer ce programme externe qui lui n'attend qu'une simple pression de la touche "F4" sur le clavier pour se terminer !!  j'ai pas mal fait d'essais, et là j'avoue ke je butte !! Quelqu'un pourrait-t-il m'éclairer sur la question ?

Jab


dimanche 6 février 2005 à 22:21:08 | Re : "Petit" problemme de HANDLE

LaPatoshe

Ne faudrait il pas que tu passes par un hook pour cela, car il semble s'agir somme toute du pilotage d'un programme par un autre programme. Un handle récupéré par un FindWindow permet de modifier quelques éléments d'apparence d'une fenête d'un autre programme comme le nom de la fenêtre, la taille... En outre, je ne sais pas si pour la cloture d'un programme cela peut se faire aussi simplement.

LaPatoshe

dimanche 6 février 2005 à 22:49:35 | Re : "Petit" problemme de HANDLE

mayti

Peut-être avec CloseHandle ?


lundi 7 février 2005 à 12:10:40 | Re : "Petit" problemme de HANDLE

BruNews

Administrateur CodeS-SourceS
A tester:
WaitForSingleObject() sur le SHELLEXECUTEINFO.hprocess
suivi d'un TerminateProcess(SHELLEXECUTEINFO.hprocess, 0);

ciao...
BruNews, MVP VC++

lundi 7 février 2005 à 18:24:04 | Re : "Petit" problemme de HANDLE

Jab_834

Membre Club

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


lundi 7 février 2005 à 18:40:27 | Re : "Petit" problemme de HANDLE

BruNews

Administrateur CodeS-SourceS
pour ne pas bloquer tu mets cela dans un thread, allait sans dire, non ?

ensuite dans ton thread, si tu veux pouvoir aussi l'arrêter proprement, tu boucles sur WaitForSingleObject() 1 fois par seconde par exemple tant que hprocess non signale. Un flag global pour indiquer si tu dois continuer à boucler ou non et le tour est joué.

ciao...
BruNews, MVP VC++



Cette discussion est classé dans : programme, handle, fenêtre, f4, externe


Répondre à ce message

Sujets en rapport avec ce message

Processus & Handle [ par ro0tsman ] Bonjour all,je voudrai savoir s'il est possible de trouver le handle d'une fenêtre à partir de son processus (id) ?Sinon de manière générale, comment #include [ par hm1964 ] Je m'arrache les cheveux qui me restent avec le problème suivant :J'ai fait un programme simple avec VC++6.0 une fenêtre, un menu et un peu de texte d retirer l'icone systray d'une app externe [ par devloop2 ] Bonjour à tous !(c'est mon premier post ici ;) )d'abord j'espère ne pas me tromper de section...Voilà j'utilise un logiciel qui met son icone dans la Console et fenêtre en meme temps [ par brosse_adan ] Bonjour!Une question qui a peut-être déjà été posé, mais dont je trouve pas la réponse: est-il possible de faire un programme qui nous affiche à la fo Popup dans un popup [ par CyberP ] J'ai créé un programme dont la seule fenêtre est une DialogBox. J'ai rajouté une autre DialogBox pour le "A propos de" mais celle-ci ne s'affiche pas Excel et window proc [ par sailline ] Bonjour, Je n'arrive pas à récupérer l'adresse de la window procedure d'une fenetre Excel : j'obtient l'erreur 5 (Access is denied) pourtant Spy++ arr Pb pour faire appel à un programme externe avec MFC [ par jujunio ] Bonjour, Mon prob est le suivant. j'ai réalisé un exécutable en C++.Et plutot que de tout refaire en MFC, je voudrais faire appel au programme.exe en Affichage graphique en temps réel [ par xb79 ] Bonjour!J'ai un programme en C++ tout simple qui n'a aucune interaction avec l'utilisateur, on peut le lancer et l'arrêter c'est tout. Ce programme fa ShowWindow(); [ par JCpp ] J'ai l'impression quand on cache une fenêtre, que le programme interne est stoppé.Et en plus, pour la réactiver à partir de ce même programme de le la Problème d'affichage [ par tibob51 ] Bonsoir,J'ai créer un programme de comptage.Donc, a l'execution une icone se place dans le barre des tache rapides et un click dessus fait augmenter l


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,312 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.