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);
相关推荐
WebBrowser控件允许在MFC应用中嵌入网页浏览功能,而C++与JavaScript之间的数据交互则为这种集成提供了更丰富的可能性。本文将深入探讨如何实现C++和JavaScript之间的数据交换,并通过提供的源代码实例进行详细讲解...
本篇将详细讲解如何利用MFC中的WebBrowser控件实现C++与JavaScript之间的数据交互传递。 首先,WebBrowser控件是MFC提供的一个ActiveX控件,它允许应用程序嵌入Internet Explorer引擎,从而在桌面应用中浏览网页、...
WebBrowser控件是Windows应用程序开发中的一个重要组件,它允许开发者在桌面应用中嵌入Web浏览功能。这个控件集包含了多种使用WebBrowser控件时的技巧和方法,可以帮助开发者更高效、更灵活地利用该控件。下面我们将...
2. 执行JavaScript:WebBrowser控件还允许执行JavaScript代码。这在需要与网页上的JavaScript进行交互或执行特定功能时非常有用: ```csharp webBrowser1.Document.InvokeScript("myFunction", new object[] { "参数...
WebBrowser控件提供了丰富的API接口,可以用来控制网页的加载、导航、交互以及执行JavaScript代码。 以下是一些关于WebBrowser控件的关键知识点: 1. **使用和配置**:在Delphi IDE中,可以从组件面板中拖拽...
在Microsoft Foundation Classes (MFC)框架中,WebBrowser控件是一个强大的工具,它允许开发者在桌面应用程序中嵌入Web浏览器的功能。这个控件是基于Internet Explorer的ActiveX控件,因此,它可以执行大部分IE浏览...
WebBrowser控件是MFC中一个强大的组件,它允许我们在应用程序内部嵌入Internet Explorer浏览器引擎,从而可以显示网页、执行JavaScript代码,以及与网页进行交互。在本案例中,我们将利用这一特性,通过调用百度地图...
这个HTML文件可能用于展示如何在客户端通过JavaScript或者其他方式触发WebBrowser控件的打印功能。 总结起来,JavaWeb开发中使用WebBrowser控件打印页面涉及了多层技术栈的交互,包括Java与.NET的互操作、Windows ...
5. **脚本错误**:网页中的JavaScript错误也可能导致`WebBrowser`控件崩溃。可以禁用脚本执行,或者捕获并处理`WebBrowser`控件的`DocumentCompleted`事件中的异常。 6. **权限问题**:如果你的应用程序在受限的...
在.NET Framework中,WinForm应用程序经常使用WebBrowser控件来集成网页浏览功能。这个控件实际上是基于Internet Explorer的渲染引擎,因此它的行为和兼容性与用户的IE版本密切相关。本篇文章将详细探讨`WinForm测试...
WebBrowser控件可以与网页中的JavaScript代码交互,通过实现IDispatch接口,开发者可以捕获和响应JavaScript调用的特定方法或事件,如按钮点击、表单提交等,从而实现C++代码与网页脚本的双向通信。 在提供的文件...
此外,由于WebBrowser控件实际上是模拟了一个浏览器实例,所以在处理JavaScript动态生成的内容时,可能需要等待JavaScript执行完毕。这可以通过使用`InvokeScript`方法或等待特定的`WebBrowser`事件来实现。 在提供...
**IE WebBrowser控件基本使用** 在Windows编程中,IE WebBrowser控件是一个非常重要的组件,它允许开发者在应用程序中嵌入一个Web浏览器的功能。这个控件基于Microsoft Internet Explorer的内核,使得开发者可以...
二是WebBrowser控件可能通过JavaScript或其他方式访问页面上的数据,这些数据可能与Access数据库有关。"下载"可能表示获取网页内容后将其保存到本地文件系统,而"源码"可能涉及查看或解析HTML源代码,以便更好地理解...
当使用WebBrowser控件加载包含JavaScript代码的网页时,可能会遇到一个bug:即当JavaScript尝试关闭当前页面时,程序会崩溃或者表现出异常行为。为了解决这个问题,可以通过重写`ApplicationMessage`方法来拦截`WM_...
总结,WPF的WebBrowser控件结合JavaScript调用托管代码,可以实现丰富的用户交互体验,但在使用过程中需要注意控制安全性和正确管理对象生命周期。通过学习和理解这些知识点,开发者可以构建出更加灵活和强大的混合...
2. 主要特性:WEBBrowser控件支持导航(加载网页)、前进、后退、停止加载、刷新页面等基本浏览器操作,还可以执行JavaScript代码、打印网页、处理网页事件等高级功能。 二、使用WEBBrowser控件 1. 添加控件:在...
- `ExecuteScript`: 在WebBrowser控件内执行JavaScript代码。 3. **WebBrowser控件的属性** - `Url`: 获取或设置WebBrowser控件当前加载的URL。 - `DocumentTitle`: 获取当前页面的标题。 - `IsBusy`: 指示...
4. **脚本禁用**:如果担心JavaScript或其他脚本语言可能造成的安全问题,可以禁用WebBrowser控件的脚本执行。通过`WebBrowser.ObjectForScripting`属性,可以设置一个空对象,从而阻止脚本与客户端代码交互。 5. *...
由于visual studio2005 中WebBrowser控件已经实现了IDocHostUIHandler,所以 只要把应用程序属性类的 "com可见"选上. 再给 this.webBrowser1.ObjectForScripting = this; 赋值就行了 InvokeScript方式: 另外:...