c++
  • windows
  • multithreading
  • messaging
  • 2008-11-11 28 views 1 likes 
    1

    我試圖啓動iexplore.exe讓它運行5秒鐘,然後再關閉它。如何使用PostThreadMessage從C++關閉Internet Explorer

    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! 
    

    任何人都知道我做錯了什麼?或者有更好的方法去做什麼?

    回答

    2

    ,如果你能列舉桌面上的窗口和發送WM_CLOSE到IE窗口,它可能工作..你可以使用間諜程序獲取窗口類的IE窗口

    +0

    我希望避免窗口的enumration,因爲我得到的句柄,進程和線程。 – CruelIO 2008-11-11 09:16:34

    1

    的什麼回報來自PostThreadMessage調用的值?這可能會提供一個線索。

    +0

    返回值爲1,所以一切都應該OK – CruelIO 2008-11-11 09:17:08

    1

    對於我來說,這完美的作品:

    TerminateProcess(procinfo.hProcess, 0); 
    
    +0

    它適用於我,但我不知道這種方法是多麼好,它清理? – CruelIO 2008-11-11 09:18:26

    +0

    沒有清理,壞主意。這很可能會泄漏臨時文件。這比內存泄漏更糟糕; HD容量的持續損失。 – MSalters 2008-11-11 09:44:45

    +0

    這種行爲正是許多Windows程序吸收的原因。 – 2008-11-11 15:12:17

    0

    我沒有回答具體爲什麼PostThreadMessage沒有工作。但是,也許如果你詳細說明你爲什麼要這樣做,那麼有更好的解決方案嗎?

    例如,如果您只想顯示5秒鐘的網頁,則可以使用嵌入式Internet Explorer ActiveX控件創建並顯示自己的窗口。您還可以添加接收器來檢測網頁何時加載到ActiveX控件中,以便在加載並顯示網頁後啓動5秒計數器。

    1

    嘗試將WM_CLOSE發送到主(頂級)窗口。這相當於正常的Alt-F4退出。

    0

    我最終做了一個窗口的枚舉(作爲你提到我的僕人應該這樣做) 我受到了http://simplesamples.info/Windows/EnumWindows.php的啓發。

    0

    請勿使用PostThreadMessage(),它會將消息發送到目標進程中的特定線程,而不是進程的Windows消息泵。使用PostMessage()或SendMessage()來代替,它將消息放置在目標進程的Windows消息泵中 - 這正是您想要的。

    0

    沒有,從來沒有使用SendMessage函數()(win32的基本規則) 不要使用EnmWindows()(可怕的)

    相關問題