CreateProcess 打开ie无法初始化

chengzenqiang 2014-03-11 09:49:11
本人使用createProcess打开一个ie浏览器,然后使用WaitForInputIdle进行子进程的初始化。
然后使用findwindow 和findwindowEX查找到刚刚打开的窗口句柄。进行操作。

如果没有ie窗口打开的话,子进程可以初始化,也能找到窗口句柄。
但是如果已经打开ie窗口后,则waitForInputIdle无法初始化。直接跳出。

下面是代码

int red=CreateProcess("C:\\Program Files\\Internet Explorer\\iexplore.exe", NULL, NULL, NULL, FALSE, CREATE_NO_WINDOW,NULL, NULL, &si, &pi);
if(0==WaitForInputIdle(pi.hProcess,3000))
{
//如果没有打开ie时,这里可以直接初始化。
//如果已经打开ie时,则直接跳出。
}
...全文
427 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengzenqiang 2014-03-11
  • 打赏
  • 举报
回复
不知道是不是我的方法错了, 是不是应该新建一个dialog窗口,然后将webbrowser2嵌入到dialog窗口里面
chengzenqiang 2014-03-11
  • 打赏
  • 举报
回复
其实我是做一个ie弹窗功能。然后过5秒后ie自动关闭
下马是代码:

BOOL ret=CreateProcess(
NULL,
"c://program files//internet explorer//iexplore.exe http://www.baidu.com",
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi);
if(0==::WaitForInputIdle(pi.hProcess,INFINITE))
{
// HWND hWnd=::FindWindow(_T("IEFrame"),NULL);
HWND w=::FindWindowEx(NULL,NULL,_T("IEFrame"),NULL);
while(w)
{
DWORD pid=0;
::GetWindowThreadProcessId(w,&pid);

char pText[128];
::GetWindowText(w,pText,128);
if(pi.dwProcessId==pid)
{
Sleep(5000);
::SendMessage(w,WM_CLOSE,0,0);
break;
}
w=::FindWindowEx(NULL,w,_T("IEFrame"),NULL);
}
Freedom 2014-03-11
  • 打赏
  • 举报
回复
引用 1 楼 Bokutake 的回复:
你的方式不对。 正规的打开IE是通过COM,可以直接得到对应的IWebBrowser2接口,对其进行各种操作,甚至可以进而得到IHtmlDocument2来对网页内容进行操作,你通过这种FindWindow进行操作的方式是很不可靠的,尤其是不能兼容不同版本界面的IE。
if (SUCCEEDED(OleInitialize(NULL)))
{
   IWebBrowser2*    pBrowser2;

   CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, 
                       IID_IWebBrowser2, (void**)&pBrowser2);
   if (pBrowser2)
   {
       VARIANT vEmpty;
       VariantInit(&vEmpty);

       BSTR bstrURL = SysAllocString(L"http://microsoft.com");

       HRESULT hr = pBrowser2->Navigate(bstrURL, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
       if (SUCCEEDED(hr))
       {
           pBrowser2->put_Visible(VARIANT_TRUE);
       }
       else
       {
           pBrowser2->Quit();
       }

       SysFreeString(bstrURL);
       pBrowser2->Release();
   }

   OleUninitialize();
}
++1
辰岡墨竹 2014-03-11
  • 打赏
  • 举报
回复
你的方式不对。 正规的打开IE是通过COM,可以直接得到对应的IWebBrowser2接口,对其进行各种操作,甚至可以进而得到IHtmlDocument2来对网页内容进行操作,你通过这种FindWindow进行操作的方式是很不可靠的,尤其是不能兼容不同版本界面的IE。
if (SUCCEEDED(OleInitialize(NULL)))
{
   IWebBrowser2*    pBrowser2;

   CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, 
                       IID_IWebBrowser2, (void**)&pBrowser2);
   if (pBrowser2)
   {
       VARIANT vEmpty;
       VariantInit(&vEmpty);

       BSTR bstrURL = SysAllocString(L"http://microsoft.com");

       HRESULT hr = pBrowser2->Navigate(bstrURL, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
       if (SUCCEEDED(hr))
       {
           pBrowser2->put_Visible(VARIANT_TRUE);
       }
       else
       {
           pBrowser2->Quit();
       }

       SysFreeString(bstrURL);
       pBrowser2->Release();
   }

   OleUninitialize();
}
chengzenqiang 2014-03-11
  • 打赏
  • 举报
回复
能具体吗。 我对vc不太熟悉,特别是要利用到窗口的时候 而且我用的MFC(dll)的项目
oyljerry 2014-03-11
  • 打赏
  • 举报
回复
IE你用console等,依赖于它的实现等。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧