我正在尝试启动 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()(可怕)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top