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?

Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top