WebBrowser 如何屏蔽javascript错误,我搜啊搜啊,搜到了
http://www.cnblogs.com/zhangqingping/archive/2009/06/16/1504260.html 和 http://support.microsoft.com/kb/261003
http://www.codeproject.com/Articles/4003/Popup-Window-Blocker
#pragma once #include <mshtmhst.h> class CNoScriptErrorHelper : public IDocHostUIHandler , public IOleCommandTarget { public: HRESULT STDMETHODCALLTYPE SetHandler(CComPtr<IWebBrowser2> spWebBrowser) { HRESULT result = E_NOINTERFACE; CComPtr<IDispatch> spDisp; HRESULT hr = spWebBrowser->get_Document(&spDisp); if (SUCCEEDED(hr) && spDisp) { // If this is not an HTML document (e.g., it's a Word doc or a PDF), don't sink. CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHTML(spDisp); if (spHTML) { // Get pointers to default interfaces CComQIPtr<IOleObject, &IID_IOleObject> spOleObject(spDisp); if (spOleObject) { CComPtr<IOleClientSite> spClientSite; hr = spOleObject->GetClientSite(&spClientSite); if (SUCCEEDED(hr) && spClientSite) { m_spDefaultDocHostUIHandler = spClientSite; m_spDefaultOleCommandTarget = spClientSite; } } // Set this class to be the IDocHostUIHandler CComQIPtr<ICustomDoc, &IID_ICustomDoc> spCustomDoc(spDisp); if (spCustomDoc) { spCustomDoc->SetUIHandler(this); result = S_OK; } } } return result; } public: HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) { HRESULT result = S_OK; if (IsBadWritePtr(ppvObject, sizeof(LPVOID))) result = E_INVALIDARG; if (result == S_OK) { *ppvObject = NULL; if ( IsEqualIID( riid, IID_IUnknown ) ) *ppvObject = this; else if ( IsEqualIID( riid, IID_IDispatch ) ) *ppvObject = (IDispatch *) this; else if ( IsEqualIID( riid, IID_IDocHostUIHandler ) ) *ppvObject = (IDocHostUIHandler *) this; else if ( IsEqualIID( riid, IID_IOleCommandTarget ) ) *ppvObject = (IOleCommandTarget *) this; else result = E_NOINTERFACE; } if (result == S_OK) this->AddRef(); return result; } ULONG STDMETHODCALLTYPE AddRef(){ InterlockedIncrement(&m_cRef); return m_cRef; } ULONG STDMETHODCALLTYPE Release() { ULONG ulRefCount = InterlockedDecrement(&m_cRef); if(m_cRef == 0) { delete this; } return ulRefCount; } STDMETHOD(ShowContextMenu)(DWORD dwID, POINT FAR* ppt, IUnknown FAR* pcmdTarget, IDispatch FAR* pdispReserved) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->ShowContextMenu(dwID, ppt, pcmdTarget, pdispReserved); return S_FALSE; } STDMETHOD(ShowUI)(DWORD dwID, IOleInPlaceActiveObject FAR* pActiveObject, IOleCommandTarget FAR* pCommandTarget, IOleInPlaceFrame FAR* pFrame, IOleInPlaceUIWindow FAR* pDoc) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->ShowUI(dwID, pActiveObject, pCommandTarget, pFrame, pDoc); return S_FALSE; } STDMETHOD(GetHostInfo)(DOCHOSTUIINFO FAR *pInfo) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->GetHostInfo(pInfo); return S_OK; } STDMETHOD(HideUI)(void) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->HideUI(); return S_OK; } STDMETHOD(UpdateUI)(void) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->UpdateUI(); return S_OK; } STDMETHOD(EnableModeless)(BOOL fEnable) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->EnableModeless(fEnable); return S_OK; } STDMETHOD(OnDocWindowActivate)(BOOL fActivate) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->OnDocWindowActivate(fActivate); return S_OK; } STDMETHOD(OnFrameWindowActivate)(BOOL fActivate) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->OnFrameWindowActivate(fActivate); return S_OK; } STDMETHOD(ResizeBorder)(LPCRECT prcBorder, IOleInPlaceUIWindow FAR* pUIWindow, BOOL fFrameWindow) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->ResizeBorder(prcBorder, pUIWindow, fFrameWindow); return S_OK; } STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID FAR* pguidCmdGroup, DWORD nCmdID) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->TranslateAccelerator(lpMsg, pguidCmdGroup, nCmdID); return E_NOTIMPL; } STDMETHOD(GetOptionKeyPath)(LPOLESTR FAR* pchKey, DWORD dw) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->GetOptionKeyPath(pchKey, dw); return E_FAIL; } STDMETHOD(GetDropTarget)(IDropTarget* pDropTarget, IDropTarget** ppDropTarget) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->GetDropTarget(pDropTarget, ppDropTarget); return S_OK; } STDMETHOD(GetExternal)(IDispatch** ppDispatch) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->GetExternal(ppDispatch); return S_FALSE; } STDMETHOD(TranslateUrl)(DWORD dwTranslate, OLECHAR* pchURLIn, OLECHAR** ppchURLOut) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->TranslateUrl(dwTranslate, pchURLIn, ppchURLOut); return S_FALSE; } STDMETHOD(FilterDataObject)(IDataObject* pDO, IDataObject** ppDORet) { if (m_spDefaultDocHostUIHandler) return m_spDefaultDocHostUIHandler->FilterDataObject(pDO, ppDORet); return S_FALSE; } // // IOleCommandTarget // STDMETHOD(QueryStatus)( /*[in]*/ const GUID *pguidCmdGroup, /*[in]*/ ULONG cCmds, /*[in,out][size_is(cCmds)]*/ OLECMD *prgCmds, /*[in,out]*/ OLECMDTEXT *pCmdText) { return m_spDefaultOleCommandTarget->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText); } STDMETHOD(Exec)( /*[in]*/ const GUID *pguidCmdGroup, /*[in]*/ DWORD nCmdID, /*[in]*/ DWORD nCmdExecOpt, /*[in]*/ VARIANTARG *pvaIn, /*[in,out]*/ VARIANTARG *pvaOut) { if (nCmdID == OLECMDID_SHOWSCRIPTERROR) { // Don't show the error dialog, but // continue running scripts on the page. (*pvaOut).vt = VT_BOOL; (*pvaOut).boolVal = VARIANT_TRUE; return S_OK; } return m_spDefaultOleCommandTarget->Exec(pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut); } private: // Default interface pointers CComQIPtr<IDocHostUIHandler, &IID_IDocHostUIHandler> m_spDefaultDocHostUIHandler; CComQIPtr<IOleCommandTarget, &IID_IOleCommandTarget> m_spDefaultOleCommandTarget; LONG m_cRef; };
使用方法:
class CBrowserView : public CWindowImpl<CBrowserView, CAxWindow> , public IDispEventImpl<_nDispatchID, CBrowserView, &DIID_DWebBrowserEvents2> { public: DECLARE_WND_SUPERCLASS(_T("BrowserView"), CAxWindow::GetWndClassName()) CNoScriptErrorHelper m_helper; BEGIN_SINK_MAP(CBrowserView) SINK_ENTRY_EX(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnEventDocumentComplete) END_SINK_MAP() void __stdcall OnEventDocumentComplete(IDispatch* pDisp, VARIANT* URL) { CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> iwebBrowser(pDisp); m_helper.SetHandler(iwebBrowser); } // Message map and handlers BEGIN_MSG_MAP(CBrowserView) MESSAGE_HANDLER(WM_CREATE, OnCreate) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) END_MSG_MAP() LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) { LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); // Connect events CComPtr spWebBrowser2; HRESULT hRet = QueryControl(IID_IWebBrowser2, (void**)&spWebBrowser2); if(SUCCEEDED(hRet)) { if(FAILED(DispEventAdvise(spWebBrowser2, &DIID_DWebBrowserEvents2))) ATLASSERT(FALSE); } // Set host flag to indicate that we handle themes CComPtr spHost; hRet = QueryHost(IID_IAxWinAmbientDispatch, (void**)&spHost); if(SUCCEEDED(hRet)) { const DWORD _DOCHOSTUIFLAG_THEME = 0x40000; hRet = spHost->put_DocHostFlags(DOCHOSTUIFLAG_NO3DBORDER | _DOCHOSTUIFLAG_THEME); ATLASSERT(SUCCEEDED(hRet)); } return lRet; } LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { // Disconnect events CComPtr spWebBrowser2; HRESULT hRet = QueryControl(IID_IWebBrowser2, (void**)&spWebBrowser2); if(SUCCEEDED(hRet)) DispEventUnadvise(spWebBrowser2, &DIID_DWebBrowserEvents2); bHandled=FALSE; return 1; } };
CBrowserView 创建窗口的时候用:
CBrowserView m_view;
m_view.Create(parentHWND, rcDefault, L"http://www.iteye.com", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL);