如何使用PostThreadMessage从C ++关闭Internet Explorer
-
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秒钟,则可以使用嵌入式Internet Explorer ActiveX控件创建和显示自己的窗口。您还可以添加一个接收器来检测何时在ActiveX控件中加载网页,这样您只有在加载并显示网页后才能启动5秒计数器。
我最后做了一个窗口的枚举(因为你提到我应该做的serval) 我受到了 http://simplesamples.info/Windows/EnumWindows.php 的启发。
不要使用PostThreadMessage(),它会将消息发送到目标进程中的特定线程而不是进程的“Windows消息泵”。使用PostMessage()或SendMessage()代替,它将消息放在目标进程的Windows消息泵中 - 这正是您想要的。
不,永远不要使用SendMessage()(基本的win32规则) 不要使用EnmWindows()(可怕)