Как мне использовать PostThreadMessage, чтобы закрыть Internet Explorer из C ++
-
07-07-2019 - |
Вопрос
Я пытаюсь запустить iexplore.exe
, запустить его в течение 5 секунд, а затем снова закрыть.
iexplore
открывается просто отлично, но не закрывается, когда я вызываю PostThreadMessage.
Кто-нибудь может увидеть, что я делаю не так? Вот мой код:
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!
Кто-нибудь имеет представление о том, что я делаю неправильно? Или есть лучший способ, как сделать трюк?
Решение
если вы можете перечислить окна на рабочем столе и отправить WM_CLOSE в окно IE, это может сработать. вы можете использовать программу-шпион, чтобы получить класс окна окна IE
Другие советы
Какое значение возвращается из вызова PostThreadMessage? Это может дать подсказку.
Для меня это прекрасно работает:
TerminateProcess(procinfo.hProcess, 0);
Попробуйте отправить WM_CLOSE в главное окно верхнего уровня. Это эквивалентно обычному выходу Alt-F4.
У меня нет конкретного ответа, почему PostThreadMessage не работал. Но, возможно, если вы уточните, почему вы хотите это сделать, есть лучшее решение?
Например, если вы просто хотите показать веб-страницу в течение 5 секунд, вы можете создать и показать собственное окно со встроенным элементом управления ActiveX Internet Explorer. Вы также сможете добавить приемник, чтобы определять, когда веб-страница загружается в элемент управления ActiveX, так что вы запускаете свой 5-секундный счетчик только после загрузки и отображения веб-страницы.
В итоге я выполнил перечисление окон (как я и говорил, я должен сделать) Я был вдохновлен http://simplesamples.info/Windows/EnumWindows.php . р>
Не используйте PostThreadMessage (), который отправляет сообщение определенному потоку в целевом процессе, а не в Windows Message Pump. Вместо этого используйте PostMessage () или SendMessage (), которые помещают сообщение в насос сообщений Windows целевого процесса - это именно то, что вам нужно.
Нет, никогда не используйте SendMessage () (основное правило win32) Не используйте EnmWindows () (ужасно)