Как мне использовать PostThreadMessage, чтобы закрыть Internet Explorer из C ++ - PullRequest
1 голос
/ 11 ноября 2008

Я пытаюсь запустить 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!

Кто-нибудь имеет представление о том, что я делаю неправильно? Или есть лучший способ, как сделать трюк?

Ответы [ 8 ]

2 голосов
/ 11 ноября 2008

если вы можете перечислить окна на рабочем столе и отправить WM_CLOSE в окно IE, это может сработать .. вы можете использовать программу-шпион, чтобы получить класс окна окна IE

1 голос
/ 11 ноября 2008

Попробуйте отправить WM_CLOSE в главное (верхний уровень) окно. Это эквивалентно обычному выходу Alt-F4.

1 голос
/ 11 ноября 2008

Для меня это прекрасно работает:

TerminateProcess(procinfo.hProcess, 0);
1 голос
/ 11 ноября 2008

Какое значение возвращается из вызова PostThreadMessage? Это может дать подсказку.

0 голосов
/ 15 ноября 2008

Нет, никогда не используйте SendMessage () (основное правило win32) Не используйте EnmWindows () (ужасно)

0 голосов
/ 11 ноября 2008

Не используйте PostThreadMessage (), который отправляет сообщение определенному потоку в целевом процессе вместо процесса Windows Pump Pump. Вместо этого используйте PostMessage () или SendMessage (), которые помещают сообщение в Windows Message Pump целевого процесса - именно то, что вам нужно.

0 голосов
/ 11 ноября 2008

Я закончил перечисление окон (как я и говорил, я должен сделать) Я был вдохновлен http://simplesamples.info/Windows/EnumWindows.php.

0 голосов
/ 11 ноября 2008

У меня нет ответа, почему PostThreadMessage не работает. Но, возможно, если вы уточните, почему вы хотите это сделать, есть лучшее решение?

Например, если вы просто хотите показать веб-страницу в течение 5 секунд, вы можете создать и показать свое собственное окно со встроенным элементом управления ActiveX Internet Explorer. Вы также сможете добавить приемник, чтобы определить, когда веб-страница загружается в элемент управления ActiveX, чтобы запускать 5-секундный счетчик только после загрузки и отображения веб-страницы.

...