switch (dispidMember) { // // The parameters for this DISPID are as follows: // [0]: Cancel flag - VT_BYREF|VT_BOOL // [1]: HTTP headers - VT_BYREF|VT_VARIANT // [2]: Address of HTTP POST data - VT_BYREF|VT_VARIANT // [3]: Target frame name - VT_BYREF|VT_VARIANT // [4]: Option flags - VT_BYREF|VT_VARIANT // [5]: URL to navigate to - VT_BYREF|VT_VARIANT // [6]: An object that evaluates to the top-level or frame // WebBrowser object corresponding to the event. // case DISPID_BEFORENAVIGATE2: OnBeforeNavigate2(); break; // // The parameters for this DISPID: // [0]: URL navigated to - VT_BYREF|VT_VARIANT // [1]: An object that evaluates to the top-level or frame // WebBrowser object corresponding to the event. // case DISPID_NAVIGATECOMPLETE2: break; // // The parameters for this DISPID: // [0]: New status bar text - VT_BSTR // case DISPID_STATUSTEXTCHANGE: break; // // The parameters for this DISPID: // [0]: Maximum progress - VT_I4 // [1]: Amount of total progress - VT_I4 // case DISPID_PROGRESSCHANGE: break; case DISPID_DOCUMENTCOMPLETE: OnDocumentComplete(); break; case DISPID_DOWNLOADBEGIN: break; case DISPID_DOWNLOADCOMPLETE: break; // // The parameters for this DISPID: // [0]: Enabled state - VT_BOOL // [1]: Command identifier - VT_I4 // case DISPID_COMMANDSTATECHANGE: break; case DISPID_NEWWINDOW2: break; // // The parameters for this DISPID: // [0]: Document title - VT_BSTR // case DISPID_TITLECHANGE: break; // // The parameters for this DISPID: // [0]: Name of property that changed - VT_BSTR // case DISPID_PROPERTYCHANGE: break; // // The parameters for this DISPID: // [0]: Address of cancel flag - VT_BYREF|VT_BOOL // case DISPID_QUIT: ::MessageBox(NULL,"",NULL,NULL);///这里好像没有执行 ManageConnection(Unadvise); break; default: break; } return S_OK; } void CYDBrowserHelperObject::OnBeforeNavigate2(){//这里修改网页代码 HRESULT hr; CComPtr<IDispatch> spDisp;
http://blog.csdn.net/lion_wing/archive/2006/06/02/769742.aspx
// IDispatch Methods
//
STDMETHODIMP CYDBrowserHelperObject::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS* pDispParams, VARIANT* pvarResult,
EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
USES_CONVERSION; if (!pDispParams)
return E_INVALIDARG;
switch (dispidMember)
{
//
// The parameters for this DISPID are as follows:
// [0]: Cancel flag - VT_BYREF|VT_BOOL
// [1]: HTTP headers - VT_BYREF|VT_VARIANT
// [2]: Address of HTTP POST data - VT_BYREF|VT_VARIANT
// [3]: Target frame name - VT_BYREF|VT_VARIANT
// [4]: Option flags - VT_BYREF|VT_VARIANT
// [5]: URL to navigate to - VT_BYREF|VT_VARIANT
// [6]: An object that evaluates to the top-level or frame
// WebBrowser object corresponding to the event.
//
case DISPID_BEFORENAVIGATE2: OnBeforeNavigate2(); break; //
// The parameters for this DISPID:
// [0]: URL navigated to - VT_BYREF|VT_VARIANT
// [1]: An object that evaluates to the top-level or frame
// WebBrowser object corresponding to the event.
//
case DISPID_NAVIGATECOMPLETE2: break; //
// The parameters for this DISPID:
// [0]: New status bar text - VT_BSTR
//
case DISPID_STATUSTEXTCHANGE:
break; //
// The parameters for this DISPID:
// [0]: Maximum progress - VT_I4
// [1]: Amount of total progress - VT_I4
//
case DISPID_PROGRESSCHANGE: break; case DISPID_DOCUMENTCOMPLETE:
OnDocumentComplete();
break; case DISPID_DOWNLOADBEGIN:
break; case DISPID_DOWNLOADCOMPLETE:
break; //
// The parameters for this DISPID:
// [0]: Enabled state - VT_BOOL
// [1]: Command identifier - VT_I4
//
case DISPID_COMMANDSTATECHANGE:
break; case DISPID_NEWWINDOW2: break; //
// The parameters for this DISPID:
// [0]: Document title - VT_BSTR
//
case DISPID_TITLECHANGE:
break; //
// The parameters for this DISPID:
// [0]: Name of property that changed - VT_BSTR
//
case DISPID_PROPERTYCHANGE:
break; //
// The parameters for this DISPID:
// [0]: Address of cancel flag - VT_BYREF|VT_BOOL
//
case DISPID_QUIT:
::MessageBox(NULL,"",NULL,NULL);///这里好像没有执行
ManageConnection(Unadvise);
break; default:
break;
} return S_OK;
}
void CYDBrowserHelperObject::OnBeforeNavigate2(){//这里修改网页代码
HRESULT hr; CComPtr<IDispatch> spDisp;
// 取得 IHTMLDocument2 的IDispatch指针
hr = m_spWebBrowser2->get_Document( &spDisp );
if( FAILED( hr ) ) return;
// 取得 IHTMLDocument2 的指针
CComQIPtr < IHTMLDocument2, &IID_IHTMLDocument2> spDoc( spDisp ); if( spDoc )
{
CComPtr < IHTMLElement > spBody;
hr = spDoc->get_body( &spBody );
if( FAILED( hr ) ) return; // Get the HTML text
//CComBSTR bstrHTMLText;
//hr = spBody->get_innerHTML( &bstrHTMLText );
//if( FAILED( hr ) ) return;
//USES_CONVERSION;
BSTR m_bsStr = _com_util::ConvertStringToBSTR("ffffffffffff<br><br><br>");
hr = spBody->put_innerHTML(m_bsStr);
//::MessageBox(NULL,OLE2CT( bstrHTMLText ),NULL,NULL);
}
}void CYDBrowserHelperObject::OnDocumentComplete(){//在这里想把网页恢复
HRESULT hr; CComPtr<IDispatch> spDisp;
// 取得 IHTMLDocument2 的IDispatch指针
hr = m_spWebBrowser2->get_Document( &spDisp );
if( FAILED( hr ) ) return;
// 取得 IHTMLDocument2 的指针
CComQIPtr < IHTMLDocument2, &IID_IHTMLDocument2> spDoc( spDisp ); if( spDoc )
{
CComPtr < IHTMLElement > spBody;
hr = spDoc->get_body( &spBody );
if( FAILED( hr ) ) return; // Get the HTML text
CComBSTR bstrHTMLText;
hr = spBody->get_outerHTML( &bstrHTMLText );
if( FAILED( hr ) ) return;
USES_CONVERSION;
::MessageBox(NULL,OLE2CT( bstrHTMLText ),NULL,NULL);
hr = spBody->put_innerHTML(bstrHTMLText);
}
}
下面这函数行不行? 听说IE5.5不支持IPersistStreamInit
怎么改?//C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\viewhtml.cpp
BOOL CYDBrowserHelperObject::GetSource(CString& refString)
{
BOOL bRetVal = FALSE;
CComPtr<IDispatch> spDisp = GetHtmlDocument(); if (spDisp != NULL)
{
HGLOBAL hMemory;
hMemory = GlobalAlloc(GMEM_MOVEABLE, 0);
if (hMemory != NULL)
{
CComQIPtr<IPersistStreamInit> spPersistStream = spDisp;
if (spPersistStream != NULL)
{
CComPtr<IStream> spStream;
if (SUCCEEDED(CreateStreamOnHGlobal(hMemory, TRUE, &spStream)))
{
spPersistStream->Save(spStream, FALSE); LPCTSTR pstr = (LPCTSTR) GlobalLock(hMemory);
if (pstr != NULL)
{
// Stream is always ANSI, but CString
// assignment operator will convert implicitly. bRetVal = TRUE;
TRY
{
refString = pstr;
}
CATCH_ALL(e)
{
bRetVal = FALSE;
DELETE_EXCEPTION(e);
}
END_CATCH_ALL if(bRetVal == FALSE)
GlobalFree(hMemory);
else
GlobalUnlock(hMemory);
}
}
}
}
}
return bRetVal;
}
我想只是BHO技术解决不了这个问题,你可以试试用Mimefilter来实现。
http://blog.csdn.net/lion_wing/archive/2006/06/27/839134.aspx
不行的。试过,得到的是put_innerHTML的东西
// 取得 IHTMLDocument2 的IDispatch指针
hr = m_spWebBrowser2->get_Document( &spDisp );
if( FAILED( hr ) ) return NULL;
// 取得 IHTMLDocument2 的指针
CComQIPtr < IHTMLDocument2, &IID_IHTMLDocument2> spDoc( spDisp ); if( spDoc )
{
CComPtr < IHTMLElement > spBody;
hr = spDoc->get_body( &spBody );
if( FAILED( hr ) ) return NULL; // Get the HTML text
CComBSTR bstrHTMLText;
hr = spBody->get_innerHTML( &bstrHTMLText );
if( FAILED( hr ) ) return NULL;
return bstrHTMLText;
//::MessageBox(NULL,_com_util::ConvertBSTRToString(bstrHTMLText),NULL,NULL);
}
return NULL;
}