Comment utiliser PostThreadMessage pour fermer Internet Explorer à partir de C ++
-
07-07-2019 - |
Question
J'essaie de démarrer iexplore.exe
, laissez-le fonctionner pendant 5 secondes, puis fermez-le à nouveau.
iexplore
s'ouvre correctement mais ne se ferme pas lorsque j'appelle PostThreadMessage.
Quelqu'un peut-il voir ce que je fais mal? Voici mon code:
CString IEPath = "C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE";//GetIEPath();
//IEPath += ' ' + url;
std::string strCommand((LPCTSTR)IEPath);
PROCESS_INFORMATION procinfo;
STARTUPINFO startupinfo;
GetStartupInfo(&startupinfo);
CreateProcess(
NULL,
(char *)strCommand.c_str(),// name of executable module
NULL, // lpProcessAttributes
NULL, // lpThreadAttributes
false, // handle inheritance option
CREATE_SHARED_WOW_VDM, // creation flags
NULL, // new environment block
NULL, // current directory name
&startupinfo, // startup information
&procinfo // process information
);
Sleep(5000);
::PostThreadMessage(procinfo.dwThreadId, WM_QUIT, 0, 0); //<---Dosent Close internet explorer!
Quelqu'un a une idée de ce que je fais mal? Ou y a-t-il un meilleur moyen de résoudre le problème?
La solution
si vous pouvez énumérer les fenêtres sur le bureau et envoyer un WM_CLOSE à la fenêtre IE, cela peut fonctionner .. vous pouvez utiliser le programme espion pour obtenir la classe window de la fenêtre IE
Autres conseils
Quelle est la valeur de retour de l'appel PostThreadMessage? Cela pourrait donner un indice.
Pour moi, cela fonctionne parfaitement:
TerminateProcess(procinfo.hProcess, 0);
Essayez d’envoyer WM_CLOSE à la fenêtre principale (de niveau supérieur). Cela équivaut à la sortie normale Alt-F4.
Je n'ai pas de réponse précise sur la raison pour laquelle PostThreadMessage n'a pas fonctionné. Mais peut-être que si vous expliquez pourquoi vous voulez faire cela, il y a une meilleure solution?
Par exemple, si vous souhaitez uniquement afficher une page Web pendant 5 secondes, vous pouvez créer et afficher votre propre fenêtre avec un contrôle ActiveX Internet Explorer incorporé. Vous pourrez également ajouter un collecteur pour détecter le chargement de la page Web dans le contrôle ActiveX, de manière à ne démarrer votre compteur de 5 secondes qu'après le chargement et l'affichage de la page Web.
J'ai fini par faire une énumération des fenêtres (comme vous le dites, je devrais le faire) Je me suis inspiré de http://simplesamples.info/Windows/EnumWindows.php .
N'utilisez pas PostThreadMessage (), qui envoie un message à un thread spécifique du processus cible au lieu de la pompe de messages Windows du processus. Utilisez plutôt PostMessage () ou SendMessage (), qui place le message dans la pompe de messages Windows du processus cible, ce qui est exactement ce que vous voulez.
Non, n'utilisez jamais SendMessage () (règle de base Win32) N'utilisez pas EnmWindows () (horrible)