Como faço para usar PostThreadMessage de perto o Internet Explorer a partir de C ++
-
07-07-2019 - |
Pergunta
Eu estou tentando começar iexplore.exe
deixá-lo correr por 5 segundos e, em seguida, fechá-lo novamente.
iexplore
abre muito bem no entanto, ele não fecha quando eu chamar o PostThreadMessage.
qualquer um pode ver o que estou fazendo de errado? Aqui está o meu código:
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!
Alguém tem uma idéia do que estou fazendo de errado? Ou há maneira melhor do que fazer o truque?
Solução
Se você pode enumerar as janelas na área de trabalho e enviar uma WM_CLOSE para a janela do IE, ele poderia funcionar .. você pode usar o programa de espionagem para obter a classe de janela da janela do IE
Outras dicas
O que é o valor de retorno da chamada PostThreadMessage? Isso pode dar uma pista.
Para mim, isso funciona perfeito:
TerminateProcess(procinfo.hProcess, 0);
Tente enviar WM_CLOSE para a janela principal (de nível superior). Isso é equivalente à saída normal Alt-F4.
Eu não tenho uma resposta especificamente porque PostThreadMessage não funcionou. Mas, talvez, se você elaborar sobre por que você quer fazer isso, não há uma solução melhor?
Por exemplo, se você só quer mostrar uma página web por 5 segundos, você pode criar e mostrar sua própria janela com um controle ActiveX do Internet Explorer embutido. Você será também capaz de adicionar uma pia para detectar quando a página é carregada no controle ActiveX, para que você começar o seu 5-segundo contador somente após a página é carregada e exibida.
Acabei fazendo uma enumeração das janelas (Como serval de você mencionou que eu deveria fazer) Eu fui inspirado de http://simplesamples.info/Windows/EnumWindows.php .
Não use PostThreadMessage (), que envia uma mensagem para uma linha específica no processo de destino, em vez do processo de bomba de mensagem do Windows. Use PostMessage () ou SendMessage () ao invés, o que coloca a mensagem na bomba de mensagens do Windows o processo do alvo -. Que é exatamente o que você quer
Não, nunca use SendMessage () (básico win32 regra) Não use EnmWindows () (horrível)