Wie verwende ich Postthreadmessage auf Internet Explorer von C ++ schließen
-
07-07-2019 - |
Frage
Ich versuche es für 5 Sekunden starten iexplore.exe
laufen zu lassen und dann wieder schließen.
iexplore
öffnet ganz gut aber es nicht schließen, wenn ich die Postthreadmessage nennen.
Kann jemand sehen, was mache ich falsch? Hier ist mein 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!
Wer eine Vorstellung davon hat, was ich falsch mache? Oder gibt es eine bessere Art und Weise, was den Trick zu tun?
Lösung
Wenn Sie die Fenster auf dem Desktop aufzählen können und eine WM_CLOSE an die IE-Fenster schicken, es könnte funktionieren .. können Sie das Spion-Programm verwenden, um die Fensterklasse der IE-Fenster zu erhalten
Andere Tipps
Was ist der Rückgabewert der Postthreadmessage Anruf? Das könnte einen Anhaltspunkt geben.
Für mich das funktioniert perfekt:
TerminateProcess(procinfo.hProcess, 0);
Versuchen WM_CLOSE an das Haupt (Top-Level) Fenster zu senden. Das entspricht dem normalen Alt-F4 verlassen.
Ich habe keine Antwort haben speziell warum Postthreadmessage nicht funktioniert hat. Aber vielleicht, wenn Sie auf auszuarbeiten, warum wollen Sie dies tun, gibt es eine bessere Lösung?
Zum Beispiel, wenn Sie nur eine Webseite für 5 Sekunden angezeigt werden sollen, können Sie erstellen und zeigen Sie Ihre eigenen Fenster mit einem eingebetteten Internet Explorer ActiveX-Steuerelement. Sie werden auch in der Lage sein, ein Waschbecken hinzufügen zu erkennen, wenn die Web-Seite in dem ActiveX-Steuerelement geladen wird, so dass Sie Ihre 5-Sekunden-Zähler nur starten, nachdem die Webseite geladen und angezeigt wird.
I ended eine Aufzählung der Fenster nach oben zu tun (wie Serval von Ihnen genannten ich tun sollte) Ich war inspiriert von http://simplesamples.info/Windows/EnumWindows.php .
Verwenden Sie nicht Postthreadmessage (), die in den Zielprozess anstelle des Prozesses Windows Message Pump eine Nachricht an einen bestimmten Thread sendet. Verwenden Sie Postmessage () oder Sendmessage () statt, die die Nachricht in dem Zielprozess Windows Message Pump platzieren -. Das ist genau das, was Sie wollen
Nein, niemals Sendmessage () (Grund win32-Regel) Verwenden Sie keine EnmWindows () (schrecklich)