Как мне использовать PostThreadMessage, чтобы закрыть Internet Explorer из C ++

StackOverflow https://stackoverflow.com/questions/280345

Вопрос

Я пытаюсь запустить 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 () (ужасно)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top