Duilib中Webbrowser事件完善使其支持判断页面加载完毕
在多iframe的页面中,需要结合DISPID_DOCUMENTCOMPLETE和DISPID_NAVIGATECOMPLETE2两个事件判断页面是否加载完毕,而duilib中没有提供对DISPID_DOCUMENTCOMPLETE的支持。
要支持DISPID_DOCUMENTCOMPLETE,需要修改UIWebBrowser.cpp、UIWebBrowser.h和WebBrowserEventHandler.h三个文件
1.WebBrowserEventHandler.h文件
添加virtual void DocumentComplete();
1 #pragma once 2 #include <ExDisp.h> 3 #include <ExDispid.h> 4 #include <mshtmhst.h> 5 6 namespaceDuiLib7 {8 classCWebBrowserEventHandler9 {10 public:11 CWebBrowserEventHandler() {}12 ~CWebBrowserEventHandler() {}13 14 virtual void BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel ) {}15 virtual void NavigateError(IDispatch *pDisp,VARIANT * &url,VARIANT *&TargetFrameName,VARIANT *&StatusCode,VARIANT_BOOL *&Cancel) {}16 virtual void NavigateComplete2(IDispatch *pDisp,VARIANT *&url){}17 virtual void DocumentComplete(){} //2016.10.19 18 virtual voidProgressChange(LONG nProgress, LONG nProgressMax){}19 virtual void NewWindow3(IDispatch **pDisp, VARIANT_BOOL *&Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl){}20 virtual void CommandStateChange(longCommand,VARIANT_BOOL Enable){};21 22 //interface IDocHostUIHandler 23 virtualHRESULT STDMETHODCALLTYPE ShowContextMenu(24 /*[in]*/DWORD dwID,25 /*[in]*/ POINT __RPC_FAR *ppt,26 /*[in]*/ IUnknown __RPC_FAR *pcmdtReserved,27 /*[in]*/ IDispatch __RPC_FAR *pdispReserved)28 {29 //return E_NOTIMPL;30 //返回 E_NOTIMPL 正常弹出系统右键菜单 31 returnS_OK;32 //返回S_OK 则可屏蔽系统右键菜单 33 }34 35 virtualHRESULT STDMETHODCALLTYPE GetHostInfo(36 /*[out][in]*/ DOCHOSTUIINFO __RPC_FAR *pInfo)37 {38 //if (pInfo != NULL)39 //{40 //pInfo->dwFlags |= DOCHOSTUIFLAG_NO3DBORDER;41 //} 42 returnS_OK;43 }44 45 virtualHRESULT STDMETHODCALLTYPE ShowUI(46 /*[in]*/DWORD dwID,47 /*[in]*/ IOleInPlaceActiveObject __RPC_FAR *pActiveObject,48 /*[in]*/ IOleCommandTarget __RPC_FAR *pCommandTarget,49 /*[in]*/ IOleInPlaceFrame __RPC_FAR *pFrame,50 /*[in]*/ IOleInPlaceUIWindow __RPC_FAR *pDoc)51 {52 returnS_FALSE;53 }54 55 virtual HRESULT STDMETHODCALLTYPE HideUI( void)56 {57 returnS_OK;58 }59 60 virtual HRESULT STDMETHODCALLTYPE UpdateUI( void)61 {62 returnS_OK;63 }64 65 virtualHRESULT STDMETHODCALLTYPE EnableModeless(66 /*[in]*/BOOL fEnable)67 {68 returnS_OK;69 }70 71 virtualHRESULT STDMETHODCALLTYPE OnDocWindowActivate(72 /*[in]*/BOOL fActivate)73 {74 returnS_OK;75 }76 77 virtualHRESULT STDMETHODCALLTYPE OnFrameWindowActivate(78 /*[in]*/BOOL fActivate)79 {80 returnS_OK;81 }82 83 virtualHRESULT STDMETHODCALLTYPE ResizeBorder(84 /*[in]*/LPCRECT prcBorder,85 /*[in]*/ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,86 /*[in]*/BOOL fRameWindow)87 {88 returnS_OK;89 }90 91 virtualHRESULT STDMETHODCALLTYPE TranslateAccelerator(92 /*[in]*/LPMSG lpMsg,93 /*[in]*/ const GUID __RPC_FAR *pguidCmdGroup,94 /*[in]*/DWORD nCmdID)95 {96 returnS_FALSE;97 }98 99 virtualHRESULT STDMETHODCALLTYPE GetOptionKeyPath(100 /*[out]*/ LPOLESTR __RPC_FAR *pchKey,101 /*[in]*/DWORD dw)102 {103 returnS_OK;104 }105 106 virtualHRESULT STDMETHODCALLTYPE GetDropTarget(107 /*[in]*/ IDropTarget __RPC_FAR *pDropTarget,108 /*[out]*/ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget)109 {110 returnE_NOTIMPL;111 }112 113 virtualHRESULT STDMETHODCALLTYPE GetExternal(114 /*[out]*/ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)115 {116 returnE_NOTIMPL;117 }118 119 virtualHRESULT STDMETHODCALLTYPE TranslateUrl(120 /*[in]*/DWORD dwTranslate,121 /*[in]*/ OLECHAR __RPC_FAR *pchURLIn,122 /*[out]*/ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut)123 {124 returnS_OK;125 }126 127 virtualHRESULT STDMETHODCALLTYPE FilterDataObject(128 /*[in]*/ IDataObject __RPC_FAR *pDO,129 /*[out]*/ IDataObject __RPC_FAR *__RPC_FAR *ppDORet)130 {131 returnS_OK;132 }133 134 //virtual HRESULT STDMETHODCALLTYPE GetOverrideKeyPath(135 ///* [annotation][out] */136 //__deref_out LPOLESTR *pchKey,137 ///* [in] */ DWORD dw)138 //{139 //return E_NOTIMPL;140 //}141 142 //IDownloadManager 143 virtualHRESULT STDMETHODCALLTYPE Download(144 /*[in]*/ IMoniker *pmk,145 /*[in]*/ IBindCtx *pbc,146 /*[in]*/DWORD dwBindVerb,147 /*[in]*/LONG grfBINDF,148 /*[in]*/ BINDINFO *pBindInfo,149 /*[in]*/LPCOLESTR pszHeaders,150 /*[in]*/LPCOLESTR pszRedir,151 /*[in]*/UINT uiCP)152 {153 returnS_OK;154 }155 };156 }
2.在UIWebBrowser.h添加
void DocumentComplete();
1 #ifndef __UIWEBBROWSER_H__2 #define __UIWEBBROWSER_H__ 3 4 #pragma once 5 6 #include "../Utils/WebBrowserEventHandler.h" 7 #include <ExDisp.h> 8 9 namespaceDuiLib10 {11 classUILIB_API CWebBrowserUI12 : publicCActiveXUI13 , publicIDocHostUIHandler14 , publicIServiceProvider15 , publicIOleCommandTarget16 , publicIDispatch17 , publicITranslateAccelerator18 {19 public:20 ///构造函数 21 CWebBrowserUI();22 virtual ~CWebBrowserUI();23 24 voidSetHomePage(LPCTSTR lpszUrl);25 LPCTSTR GetHomePage();26 27 void SetAutoNavigation(bool bAuto =TRUE);28 boolIsAutoNavigation();29 30 void SetWebBrowserEventHandler(CWebBrowserEventHandler*pEventHandler);31 voidNavigate2(LPCTSTR lpszUrl);32 voidRefresh();33 void Refresh2(intLevel);34 voidGoBack();35 voidGoForward();36 voidNavigateHomePage();37 voidNavigateUrl(LPCTSTR lpszUrl);38 virtual boolDoCreateControl();39 IWebBrowser2* GetWebBrowser2(void);40 IDispatch*GetHtmlWindow();41 static DISPID FindId(IDispatch *pObj, LPOLESTR pName);42 static HRESULT InvokeMethod(IDispatch *pObj, LPOLESTR pMehtod, VARIANT *pVarResult, VARIANT *ps, intcArgs);43 static HRESULT GetProperty(IDispatch *pObj, LPOLESTR pName, VARIANT *pValue);44 static HRESULT SetProperty(IDispatch *pObj, LPOLESTR pName, VARIANT *pValue);45 46 protected:47 IWebBrowser2* m_pWebBrowser2; //浏览器指针 48 IHTMLWindow2*_pHtmlWnd2;49 LONG m_dwRef;50 DWORD m_dwCookie;51 virtual voidReleaseControl();52 HRESULT RegisterEventHandler(BOOL inAdvise);53 virtual voidSetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);54 CDuiString m_sHomePage; //默认页面 55 bool m_bAutoNavi; //是否启动时打开默认页面 56 CWebBrowserEventHandler* m_pWebBrowserEventHandler; //浏览器事件处理57 58 //DWebBrowserEvents2 59 void BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel );60 void NavigateError(IDispatch *pDisp,VARIANT * &url,VARIANT *&TargetFrameName,VARIANT *&StatusCode,VARIANT_BOOL *&Cancel);61 void NavigateComplete2(IDispatch *pDisp,VARIANT *&url);62 voidProgressChange(LONG nProgress, LONG nProgressMax);63 void NewWindow3(IDispatch **pDisp, VARIANT_BOOL *&Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl);64 void CommandStateChange(longCommand,VARIANT_BOOL Enable);65 void DocumentComplete();//201610.19 66 public:67 virtual LPCTSTR GetClass() const;68 virtualLPVOID GetInterface( LPCTSTR pstrName );69 70 //IUnknown 71 STDMETHOD_(ULONG,AddRef)();72 STDMETHOD_(ULONG,Release)();73 STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject);74 75 //IDispatch 76 virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( __RPC__out UINT *pctinfo );77 virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( UINT iTInfo, LCID lcid, __RPC__deref_out_opt ITypeInfo **ppTInfo );78 virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( __RPC__in REFIID riid, __RPC__in_ecount_full(cNames ) LPOLESTR *rgszNames, UINT cNames, LCID lcid, __RPC__out_ecount_full(cNames) DISPID *rgDispId);79 virtual HRESULT STDMETHODCALLTYPE Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr );80 81 //IDocHostUIHandler 82 STDMETHOD(ShowContextMenu)(DWORD dwID, POINT* pptPosition, IUnknown* pCommandTarget, IDispatch*pDispatchObjectHit);83 STDMETHOD(GetHostInfo)(DOCHOSTUIINFO*pInfo);84 STDMETHOD(ShowUI)(DWORD dwID, IOleInPlaceActiveObject* pActiveObject, IOleCommandTarget* pCommandTarget, IOleInPlaceFrame* pFrame, IOleInPlaceUIWindow*pDoc);85 STDMETHOD(HideUI)();86 STDMETHOD(UpdateUI)();87 STDMETHOD(EnableModeless)(BOOL fEnable);88 STDMETHOD(OnDocWindowActivate)(BOOL fActivate);89 STDMETHOD(OnFrameWindowActivate)(BOOL fActivate);90 STDMETHOD(ResizeBorder)(LPCRECT prcBorder, IOleInPlaceUIWindow*pUIWindow, BOOL fFrameWindow);91 STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID* pguidCmdGroup, DWORD nCmdID); //浏览器消息过滤 92 STDMETHOD(GetOptionKeyPath)(LPOLESTR*pchKey, DWORD dwReserved);93 STDMETHOD(GetDropTarget)(IDropTarget* pDropTarget, IDropTarget**ppDropTarget);94 STDMETHOD(GetExternal)(IDispatch**ppDispatch);95 STDMETHOD(TranslateUrl)(DWORD dwTranslate, OLECHAR* pchURLIn, OLECHAR**ppchURLOut);96 STDMETHOD(FilterDataObject)(IDataObject* pDO, IDataObject**ppDORet);97 98 //IServiceProvider 99 STDMETHOD(QueryService)(REFGUID guidService, REFIID riid, void**ppvObject);100 101 //IOleCommandTarget 102 virtual HRESULT STDMETHODCALLTYPE QueryStatus( __RPC__in_opt const GUID *pguidCmdGroup, ULONG cCmds, __RPC__inout_ecount_full(cCmds ) OLECMD prgCmds[ ], __RPC__inout_opt OLECMDTEXT *pCmdText);103 virtual HRESULT STDMETHODCALLTYPE Exec( __RPC__in_opt const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, __RPC__in_opt VARIANT *pvaIn, __RPC__inout_opt VARIANT *pvaOut );104 105 //IDownloadManager 106 STDMETHOD(Download)(107 /*[in]*/ IMoniker *pmk,108 /*[in]*/ IBindCtx *pbc,109 /*[in]*/DWORD dwBindVerb,110 /*[in]*/LONG grfBINDF,111 /*[in]*/ BINDINFO *pBindInfo,112 /*[in]*/LPCOLESTR pszHeaders,113 /*[in]*/LPCOLESTR pszRedir,114 /*[in]*/UINT uiCP);115 116 //ITranslateAccelerator117 //Duilib消息分发给WebBrowser 118 virtual LRESULT TranslateAccelerator( MSG *pMsg );119 };120 } //namespace DuiLib 121 #endif //__UIWEBBROWSER_H__
3.UIWebBrowser.cpp添加实现
1 #include "StdAfx.h" 2 #include "UIWebBrowser.h" 3 #include <atlconv.h> 4 #include <atlcomcli.h> 5 #include "../Utils/downloadmgr.h" 6 #include <mshtml.h> 7 8 DuiLib::CWebBrowserUI::CWebBrowserUI()9 : m_pWebBrowser2(NULL)10 , _pHtmlWnd2(NULL)11 , m_pWebBrowserEventHandler(NULL)12 , m_bAutoNavi(false)13 , m_dwRef(0)14 , m_dwCookie(0)15 {16 m_clsid=CLSID_WebBrowser;17 m_sHomePage.Empty();18 }19 20 boolDuiLib::CWebBrowserUI::DoCreateControl()21 {22 if (!CActiveXUI::DoCreateControl())23 return false;24 GetManager()->AddTranslateAccelerator(this);25 GetControl(IID_IWebBrowser2,(LPVOID*)&m_pWebBrowser2);26 if ( m_bAutoNavi && !m_sHomePage.IsEmpty())27 {28 this->Navigate2(m_sHomePage);29 }30 RegisterEventHandler(TRUE);31 return true;32 }33 34 voidDuiLib::CWebBrowserUI::ReleaseControl()35 {36 m_bCreated=false;37 GetManager()->RemoveTranslateAccelerator(this);38 RegisterEventHandler(FALSE);39 }40 41 DuiLib::CWebBrowserUI::~CWebBrowserUI()42 {43 ReleaseControl();44 }45 46 STDMETHODIMP DuiLib::CWebBrowserUI::GetTypeInfoCount( UINT *iTInfo )47 {48 *iTInfo = 0;49 returnE_NOTIMPL;50 }51 52 STDMETHODIMP DuiLib::CWebBrowserUI::GetTypeInfo( UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo )53 {54 returnE_NOTIMPL;55 }56 57 STDMETHODIMP DuiLib::CWebBrowserUI::GetIDsOfNames( REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid,DISPID *rgDispId )58 {59 returnE_NOTIMPL;60 }61 62 STDMETHODIMP DuiLib::CWebBrowserUI::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid,WORD wFlags, DISPPARAMS* pDispParams,VARIANT* pVarResult, EXCEPINFO* pExcepInfo,UINT*puArgErr )63 {64 if ((riid !=IID_NULL))65 returnE_INVALIDARG;66 67 switch(dispIdMember)68 {69 caseDISPID_BEFORENAVIGATE2:70 BeforeNavigate2(71 pDispParams->rgvarg[6].pdispVal,72 pDispParams->rgvarg[5].pvarVal,73 pDispParams->rgvarg[4].pvarVal,74 pDispParams->rgvarg[3].pvarVal,75 pDispParams->rgvarg[2].pvarVal,76 pDispParams->rgvarg[1].pvarVal,77 pDispParams->rgvarg[0].pboolVal);78 break;79 caseDISPID_COMMANDSTATECHANGE:80 CommandStateChange(81 pDispParams->rgvarg[1].lVal,82 pDispParams->rgvarg[0].boolVal);83 break;84 caseDISPID_NAVIGATECOMPLETE2:85 NavigateComplete2(86 pDispParams->rgvarg[1].pdispVal,87 pDispParams->rgvarg[0].pvarVal);88 break;89 caseDISPID_NAVIGATEERROR:90 NavigateError(91 pDispParams->rgvarg[4].pdispVal,92 pDispParams->rgvarg[3].pvarVal,93 pDispParams->rgvarg[2].pvarVal,94 pDispParams->rgvarg[1].pvarVal,95 pDispParams->rgvarg[0].pboolVal);96 break;97 caseDISPID_STATUSTEXTCHANGE:98 break;99 //case DISPID_NEWWINDOW2:100 //break; 101 caseDISPID_NEWWINDOW3:102 NewWindow3(103 pDispParams->rgvarg[4].ppdispVal,104 pDispParams->rgvarg[3].pboolVal,105 pDispParams->rgvarg[2].uintVal,106 pDispParams->rgvarg[1].bstrVal,107 pDispParams->rgvarg[0].bstrVal);108 break;109 //case DISPID_PROPERTYCHANGE:110 //if (pDispParams->cArgs>0 && pDispParams->rgvarg[0].vt == VT_BSTR) {111 //TRACE(_T("PropertyChange(%s)\n"), pDispParams->rgvarg[0].bstrVal);112 //}113 //break; 114 115 caseDISPID_DOCUMENTCOMPLETE:116 DocumentComplete();//2016.10.19 117 break;118 default:119 returnDISP_E_MEMBERNOTFOUND;120 }121 returnS_OK;122 }123 124 STDMETHODIMP DuiLib::CWebBrowserUI::QueryInterface( REFIID riid, LPVOID *ppvObject )125 {126 *ppvObject =NULL;127 128 if( riid ==IID_IDocHostUIHandler)129 *ppvObject = static_cast<IDocHostUIHandler*>(this);130 else if( riid ==IID_IDispatch)131 *ppvObject = static_cast<IDispatch*>(this);132 else if( riid ==IID_IServiceProvider)133 *ppvObject = static_cast<IServiceProvider*>(this);134 else if (riid ==IID_IOleCommandTarget)135 *ppvObject = static_cast<IOleCommandTarget*>(this);136 137 if( *ppvObject !=NULL )138 AddRef();139 return *ppvObject == NULL ?E_NOINTERFACE : S_OK;140 }141 142 STDMETHODIMP_(ULONG) DuiLib::CWebBrowserUI::AddRef()143 {144 InterlockedIncrement(&m_dwRef);145 returnm_dwRef;146 }147 148 STDMETHODIMP_(ULONG) DuiLib::CWebBrowserUI::Release()149 {150 ULONG ulRefCount = InterlockedDecrement(&m_dwRef);151 returnulRefCount;152 }153 154 voidDuiLib::CWebBrowserUI::Navigate2( LPCTSTR lpszUrl )155 {156 if (lpszUrl ==NULL)157 return;158 159 if(m_pWebBrowser2)160 {161 CVariant url;162 url.vt=VT_BSTR;163 url.bstrVal=T2BSTR(lpszUrl);164 HRESULT hr = m_pWebBrowser2->Navigate2(&url, NULL, NULL, NULL, NULL);165 }166 }167 168 voidDuiLib::CWebBrowserUI::Refresh()169 {170 if(m_pWebBrowser2)171 {172 m_pWebBrowser2->Refresh();173 }174 }175 voidDuiLib::CWebBrowserUI::GoBack()176 {177 if(m_pWebBrowser2)178 {179 m_pWebBrowser2->GoBack();180 }181 }182 voidDuiLib::CWebBrowserUI::GoForward()183 {184 if(m_pWebBrowser2)185 {186 m_pWebBrowser2->GoForward();187 }188 }189 ///DWebBrowserEvents2 190 void DuiLib::CWebBrowserUI::BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel )191 {192 if(m_pWebBrowserEventHandler)193 {194 m_pWebBrowserEventHandler->BeforeNavigate2(pDisp,url,Flags,TargetFrameName,PostData,Headers,Cancel);195 }196 }197 198 void DuiLib::CWebBrowserUI::NavigateError( IDispatch *pDisp,VARIANT * &url,VARIANT *&TargetFrameName,VARIANT *&StatusCode,VARIANT_BOOL *&Cancel )199 {200 if(m_pWebBrowserEventHandler)201 {202 m_pWebBrowserEventHandler->NavigateError(pDisp,url,TargetFrameName,StatusCode,Cancel);203 }204 }205 206 void DuiLib::CWebBrowserUI::NavigateComplete2( IDispatch *pDisp,VARIANT *&url )207 {208 CComPtr<IDispatch>spDoc;209 m_pWebBrowser2->get_Document(&spDoc);210 211 if(spDoc)212 {213 CComQIPtr<ICustomDoc, &IID_ICustomDoc>spCustomDoc(spDoc);214 if(spCustomDoc)215 spCustomDoc->SetUIHandler(this);216 }217 218 if(m_pWebBrowserEventHandler)219 {220 m_pWebBrowserEventHandler->NavigateComplete2(pDisp,url);221 }222 }223 224 voidDuiLib::CWebBrowserUI::ProgressChange( LONG nProgress, LONG nProgressMax )225 {226 if(m_pWebBrowserEventHandler)227 {228 m_pWebBrowserEventHandler->ProgressChange(nProgress,nProgressMax);229 }230 }231 232 void DuiLib::CWebBrowserUI::NewWindow3( IDispatch **pDisp, VARIANT_BOOL *&Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl )233 {234 if(m_pWebBrowserEventHandler)235 {236 m_pWebBrowserEventHandler->NewWindow3(pDisp,Cancel,dwFlags,bstrUrlContext,bstrUrl);237 }238 }239 void DuiLib::CWebBrowserUI::CommandStateChange(longCommand,VARIANT_BOOL Enable)240 {241 if(m_pWebBrowserEventHandler)242 {243 m_pWebBrowserEventHandler->CommandStateChange(Command,Enable);244 }245 }246 void DuiLib::CWebBrowserUI::DocumentComplete()//2016.10.19 247 {248 if(m_pWebBrowserEventHandler)249 {250 m_pWebBrowserEventHandler->DocumentComplete();251 }252 }253 254 //IDownloadManager 255 STDMETHODIMP DuiLib::CWebBrowserUI::Download( /*[in]*/ IMoniker *pmk, /*[in]*/ IBindCtx *pbc, /*[in]*/ DWORD dwBindVerb, /*[in]*/ LONG grfBINDF, /*[in]*/ BINDINFO *pBindInfo, /*[in]*/ LPCOLESTR pszHeaders, /*[in]*/ LPCOLESTR pszRedir, /*[in]*/UINT uiCP )256 {257 if(m_pWebBrowserEventHandler)258 {259 return m_pWebBrowserEventHandler->Download(pmk,pbc,dwBindVerb,grfBINDF,pBindInfo,pszHeaders,pszRedir,uiCP);260 }261 returnS_OK;262 }263 264 //IDocHostUIHandler 265 STDMETHODIMP DuiLib::CWebBrowserUI::ShowContextMenu( DWORD dwID, POINT* pptPosition, IUnknown* pCommandTarget, IDispatch*pDispatchObjectHit )266 {267 if(m_pWebBrowserEventHandler)268 {269 return m_pWebBrowserEventHandler->ShowContextMenu(dwID,pptPosition,pCommandTarget,pDispatchObjectHit);270 }271 returnS_FALSE;272 }273 274 STDMETHODIMP DuiLib::CWebBrowserUI::GetHostInfo( DOCHOSTUIINFO*pInfo )275 {276 if(m_pWebBrowserEventHandler)277 {278 return m_pWebBrowserEventHandler->GetHostInfo(pInfo);279 }280 returnE_NOTIMPL;281 }282 283 STDMETHODIMP DuiLib::CWebBrowserUI::ShowUI( DWORD dwID, IOleInPlaceActiveObject* pActiveObject, IOleCommandTarget* pCommandTarget, IOleInPlaceFrame* pFrame, IOleInPlaceUIWindow*pDoc )284 {285 if(m_pWebBrowserEventHandler)286 {287 return m_pWebBrowserEventHandler->ShowUI(dwID,pActiveObject,pCommandTarget,pFrame,pDoc);288 }289 returnS_OK;290 }291 292 STDMETHODIMP DuiLib::CWebBrowserUI::HideUI()293 {294 if(m_pWebBrowserEventHandler)295 {296 return m_pWebBrowserEventHandler->HideUI();297 }298 returnS_OK;299 }300 301 STDMETHODIMP DuiLib::CWebBrowserUI::UpdateUI()302 {303 if(m_pWebBrowserEventHandler)304 {305 return m_pWebBrowserEventHandler->UpdateUI();306 }307 returnS_OK;308 }309 310 STDMETHODIMP DuiLib::CWebBrowserUI::EnableModeless( BOOL fEnable )311 {312 if(m_pWebBrowserEventHandler)313 {314 return m_pWebBrowserEventHandler->EnableModeless(fEnable);315 }316 returnE_NOTIMPL;317 }318 319 STDMETHODIMP DuiLib::CWebBrowserUI::OnDocWindowActivate( BOOL fActivate )320 {321 if(m_pWebBrowserEventHandler)322 {323 return m_pWebBrowserEventHandler->OnDocWindowActivate(fActivate);324 }325 returnE_NOTIMPL;326 }327 328 STDMETHODIMP DuiLib::CWebBrowserUI::OnFrameWindowActivate( BOOL fActivate )329 {330 if(m_pWebBrowserEventHandler)331 {332 return m_pWebBrowserEventHandler->OnFrameWindowActivate(fActivate);333 }334 returnE_NOTIMPL;335 }336 337 STDMETHODIMP DuiLib::CWebBrowserUI::ResizeBorder( LPCRECT prcBorder, IOleInPlaceUIWindow*pUIWindow, BOOL fFrameWindow )338 {339 if(m_pWebBrowserEventHandler)340 {341 return m_pWebBrowserEventHandler->ResizeBorder(prcBorder,pUIWindow,fFrameWindow);342 }343 returnE_NOTIMPL;344 }345 346 STDMETHODIMP DuiLib::CWebBrowserUI::TranslateAccelerator( LPMSG lpMsg, const GUID*pguidCmdGroup, DWORD nCmdID )347 {348 if(m_pWebBrowserEventHandler)349 {350 return m_pWebBrowserEventHandler->TranslateAccelerator(lpMsg,pguidCmdGroup,nCmdID);351 }352 returnS_FALSE;353 }354 355 LRESULT DuiLib::CWebBrowserUI::TranslateAccelerator( MSG *pMsg )356 {357 if(pMsg->message < WM_KEYFIRST || pMsg->message >WM_KEYLAST)358 returnS_FALSE;359 360 if( m_pWebBrowser2 ==NULL )361 returnE_NOTIMPL;362 363 //当前Web窗口不是焦点,不处理加速键 364 BOOL bIsChild =FALSE;365 HWND hTempWnd =NULL;366 HWND hWndFocus =::GetFocus();367 368 hTempWnd =hWndFocus;369 while(hTempWnd !=NULL)370 {371 if(hTempWnd ==m_hwndHost)372 {373 bIsChild =TRUE;374 break;375 }376 hTempWnd =::GetParent(hTempWnd);377 }378 if(!bIsChild)379 returnS_FALSE;380 381 IOleInPlaceActiveObject *pObj;382 if (FAILED(m_pWebBrowser2->QueryInterface(IID_IOleInPlaceActiveObject, (LPVOID *)&pObj)))383 returnS_FALSE;384 385 HRESULT hResult = pObj->TranslateAccelerator(pMsg);386 pObj->Release();387 returnhResult;388 }389 390 STDMETHODIMP DuiLib::CWebBrowserUI::GetOptionKeyPath( LPOLESTR*pchKey, DWORD dwReserved )391 {392 if(m_pWebBrowserEventHandler)393 {394 return m_pWebBrowserEventHandler->GetOptionKeyPath(pchKey,dwReserved);395 }396 returnE_NOTIMPL;397 }398 399 STDMETHODIMP DuiLib::CWebBrowserUI::GetDropTarget( IDropTarget* pDropTarget, IDropTarget**ppDropTarget )400 {401 if(m_pWebBrowserEventHandler)402 {403 return m_pWebBrowserEventHandler->GetDropTarget(pDropTarget,ppDropTarget);404 }405 return S_FALSE; //使用系统拖拽 406 }407 408 STDMETHODIMP DuiLib::CWebBrowserUI::GetExternal( IDispatch**ppDispatch )409 {410 if(m_pWebBrowserEventHandler)411 {412 return m_pWebBrowserEventHandler->GetExternal(ppDispatch);413 }414 returnS_FALSE;415 }416 417 STDMETHODIMP DuiLib::CWebBrowserUI::TranslateUrl( DWORD dwTranslate, OLECHAR* pchURLIn, OLECHAR**ppchURLOut )418 {419 if(m_pWebBrowserEventHandler)420 {421 return m_pWebBrowserEventHandler->TranslateUrl(dwTranslate,pchURLIn,ppchURLOut);422 }423 else 424 {425 *ppchURLOut = 0;426 returnE_NOTIMPL;427 }428 }429 430 STDMETHODIMP DuiLib::CWebBrowserUI::FilterDataObject( IDataObject* pDO, IDataObject**ppDORet )431 {432 if(m_pWebBrowserEventHandler)433 {434 return m_pWebBrowserEventHandler->FilterDataObject(pDO,ppDORet);435 }436 else 437 {438 *ppDORet = 0;439 returnE_NOTIMPL;440 }441 }442 443 void DuiLib::CWebBrowserUI::SetWebBrowserEventHandler( CWebBrowserEventHandler*pEventHandler )444 {445 if ( pEventHandler!=NULL && m_pWebBrowserEventHandler!=pEventHandler)446 m_pWebBrowserEventHandler=pEventHandler;447 }448 449 void DuiLib::CWebBrowserUI::Refresh2( intLevel )450 {451 CVariant vLevel;452 vLevel.vt=VT_I4;453 vLevel.intVal=Level;454 m_pWebBrowser2->Refresh2(&vLevel);455 }456 457 voidDuiLib::CWebBrowserUI::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )458 {459 if (_tcscmp(pstrName, _T("homepage")) == 0)460 {461 m_sHomePage =pstrValue;462 }463 else if (_tcscmp(pstrName, _T("autonavi"))==0)464 {465 m_bAutoNavi = (_tcscmp(pstrValue, _T("true")) == 0);466 }467 else 468 CActiveXUI::SetAttribute(pstrName, pstrValue);469 }470 471 voidDuiLib::CWebBrowserUI::NavigateHomePage()472 {473 if (!m_sHomePage.IsEmpty())474 this->NavigateUrl(m_sHomePage);475 }476 477 voidDuiLib::CWebBrowserUI::NavigateUrl( LPCTSTR lpszUrl )478 {479 if (m_pWebBrowser2 &&lpszUrl)480 {481 m_pWebBrowser2->Navigate((BSTR)SysAllocString(T2BSTR(lpszUrl)),NULL,NULL,NULL,NULL);482 }483 }484 485 LPCTSTR DuiLib::CWebBrowserUI::GetClass() const 486 {487 return _T("WebBrowserUI");488 }489 490 LPVOID DuiLib::CWebBrowserUI::GetInterface( LPCTSTR pstrName )491 {492 if( _tcscmp(pstrName, DUI_CTR_WEBBROWSER) == 0 ) return static_cast<CWebBrowserUI*>(this);493 returnCActiveXUI::GetInterface(pstrName);494 }495 496 voidDuiLib::CWebBrowserUI::SetHomePage( LPCTSTR lpszUrl )497 {498 m_sHomePage.Format(_T("%s"),lpszUrl);499 }500 501 LPCTSTR DuiLib::CWebBrowserUI::GetHomePage()502 {503 returnm_sHomePage;504 }505 506 void DuiLib::CWebBrowserUI::SetAutoNavigation( bool bAuto /*= TRUE*/)507 {508 if (m_bAutoNavi==bAuto) return;509 510 m_bAutoNavi=bAuto;511 }512 513 boolDuiLib::CWebBrowserUI::IsAutoNavigation()514 {515 returnm_bAutoNavi;516 }517 518 STDMETHODIMP DuiLib::CWebBrowserUI::QueryService( REFGUID guidService, REFIID riid, void**ppvObject )519 {520 HRESULT hr =E_NOINTERFACE;521 *ppvObject =NULL;522 523 if ( guidService == SID_SDownloadManager && riid ==IID_IDownloadManager)524 {525 *ppvObject = this;526 returnS_OK;527 }528 529 returnhr;530 }531 532 HRESULT DuiLib::CWebBrowserUI::RegisterEventHandler( BOOL inAdvise )533 {534 CComPtr<IWebBrowser2>pWebBrowser;535 CComPtr<IConnectionPointContainer>pCPC;536 CComPtr<IConnectionPoint>pCP;537 HRESULT hr = GetControl(IID_IWebBrowser2, (void**)&pWebBrowser);538 if(FAILED(hr))539 returnhr;540 hr=pWebBrowser->QueryInterface(IID_IConnectionPointContainer,(void **)&pCPC);541 if(FAILED(hr))542 returnhr;543 hr=pCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,&pCP);544 if(FAILED(hr))545 returnhr;546 547 if(inAdvise)548 {549 hr = pCP->Advise((IDispatch*)this, &m_dwCookie);550 }551 else 552 {553 hr = pCP->Unadvise(m_dwCookie);554 }555 returnhr;556 }557 558 DISPID DuiLib::CWebBrowserUI::FindId( IDispatch *pObj, LPOLESTR pName )559 {560 DISPID id = 0;561 if(FAILED(pObj->GetIDsOfNames(IID_NULL,&pName,1,LOCALE_SYSTEM_DEFAULT,&id))) id = -1;562 returnid;563 }564 565 HRESULT DuiLib::CWebBrowserUI::InvokeMethod( IDispatch *pObj, LPOLESTR pMehtod, VARIANT *pVarResult, VARIANT *ps, intcArgs )566 {567 DISPID dispid =FindId(pObj, pMehtod);568 if(dispid == -1) returnE_FAIL;569 570 DISPPARAMS dispparams;571 dispparams.cArgs =cArgs;572 dispparams.rgvarg =ps;573 dispparams.cNamedArgs = 0;574 dispparams.rgdispidNamedArgs =NULL;575 576 return pObj->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparams, pVarResult, NULL, NULL);577 }578 579 HRESULT DuiLib::CWebBrowserUI::GetProperty( IDispatch *pObj, LPOLESTR pName, VARIANT *pValue )580 {581 DISPID dispid =FindId(pObj, pName);582 if(dispid == -1) returnE_FAIL;583 584 DISPPARAMS ps;585 ps.cArgs = 0;586 ps.rgvarg =NULL;587 ps.cNamedArgs = 0;588 ps.rgdispidNamedArgs =NULL;589 590 return pObj->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &ps, pValue, NULL, NULL);591 }592 593 HRESULT DuiLib::CWebBrowserUI::SetProperty( IDispatch *pObj, LPOLESTR pName, VARIANT *pValue )594 {595 DISPID dispid =FindId(pObj, pName);596 if(dispid == -1) returnE_FAIL;597 598 DISPPARAMS ps;599 ps.cArgs = 1;600 ps.rgvarg =pValue;601 ps.cNamedArgs = 0;602 ps.rgdispidNamedArgs =NULL;603 604 return pObj->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &ps, NULL, NULL, NULL);605 }606 607 IDispatch*DuiLib::CWebBrowserUI::GetHtmlWindow()608 {609 IDispatch* pDp =NULL;610 HRESULT hr;611 if(m_pWebBrowser2)612 hr=m_pWebBrowser2->get_Document(&pDp);613 614 if(FAILED(hr))615 returnNULL;616 617 CComQIPtr<IHTMLDocument2> pHtmlDoc2 =pDp;618 619 if (pHtmlDoc2 ==NULL)620 returnNULL;621 622 hr=pHtmlDoc2->get_parentWindow(&_pHtmlWnd2);623 624 if(FAILED(hr))625 returnNULL;626 627 IDispatch *pHtmlWindown =NULL;628 hr=_pHtmlWnd2->QueryInterface(IID_IDispatch, (void**)&pHtmlWindown);629 if(FAILED(hr))630 returnNULL;631 632 returnpHtmlWindown;633 }634 635 IWebBrowser2* DuiLib::CWebBrowserUI::GetWebBrowser2( void)636 {637 returnm_pWebBrowser2;638 }639 640 HRESULT STDMETHODCALLTYPE DuiLib::CWebBrowserUI::QueryStatus( __RPC__in_opt const GUID *pguidCmdGroup, ULONG cCmds, __RPC__inout_ecount_full(cCmds ) OLECMD prgCmds[ ], __RPC__inout_opt OLECMDTEXT *pCmdText )641 {642 HRESULT hr =OLECMDERR_E_NOTSUPPORTED;643 returnhr;644 }645 646 HRESULT STDMETHODCALLTYPE DuiLib::CWebBrowserUI::Exec( __RPC__in_opt const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, __RPC__in_opt VARIANT *pvaIn, __RPC__inout_opt VARIANT *pvaOut )647 {648 HRESULT hr =S_OK;649 650 if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CGID_DocHostCommandHandler))651 {652 653 switch(nCmdID)654 {655 656 caseOLECMDID_SHOWSCRIPTERROR:657 {658 IHTMLDocument2* pDoc =NULL;659 IHTMLWindow2* pWindow =NULL;660 IHTMLEventObj* pEventObj =NULL;661 BSTR rgwszNames[5] = 662 {663 SysAllocString(L"errorLine"),664 SysAllocString(L"errorCharacter"),665 SysAllocString(L"errorCode"),666 SysAllocString(L"errorMessage"),667 SysAllocString(L"errorUrl")668 };669 DISPID rgDispIDs[5];670 VARIANT rgvaEventInfo[5];671 DISPPARAMS params;672 BOOL fContinueRunningScripts = true;673 inti;674 675 params.cArgs = 0;676 params.cNamedArgs = 0;677 678 //Get the document that is currently being viewed. 679 hr = pvaIn->punkVal->QueryInterface(IID_IHTMLDocument2, (void **) &pDoc);680 //Get document.parentWindow. 681 hr = pDoc->get_parentWindow(&pWindow);682 pDoc->Release();683 //Get the window.event object. 684 hr = pWindow->get_event(&pEventObj);685 //Get the error info from the window.event object. 686 for (i = 0; i < 5; i++)687 {688 //Get the property's dispID. 689 hr = pEventObj->GetIDsOfNames(IID_NULL, &rgwszNames[i], 1,690 LOCALE_SYSTEM_DEFAULT, &rgDispIDs[i]);691 //Get the value of the property. 692 hr = pEventObj->Invoke(rgDispIDs[i], IID_NULL,693 LOCALE_SYSTEM_DEFAULT,694 DISPATCH_PROPERTYGET, ¶ms, &rgvaEventInfo[i],695 NULL, NULL);696 SysFreeString(rgwszNames[i]);697 }698 699 //At this point, you would normally alert the user with700 //the information about the error, which is now contained701 //in rgvaEventInfo[]. Or, you could just exit silently. 702 703 (*pvaOut).vt =VT_BOOL;704 if(fContinueRunningScripts)705 {706 //Continue running scripts on the page. 707 (*pvaOut).boolVal =VARIANT_TRUE;708 }709 else 710 {711 //Stop running scripts on the page. 712 (*pvaOut).boolVal =VARIANT_FALSE;713 }714 break;715 }716 default:717 hr =OLECMDERR_E_NOTSUPPORTED;718 break;719 }720 }721 else 722 {723 hr =OLECMDERR_E_UNKNOWNGROUP;724 }725 return(hr);726 }
带参数的:
源码
Duilib中Webbrowser事件完善使其支持判断页面加载完毕相关推荐
- 用ffmpeg修改MP4文件头信息,使其支持流式加载及播放
经常有用户反映,有些网页中加载的mp4文件,有的可以加载一点就开始播放,有的就必须全部加载完才能播. 经核实,主要是头信息的数据顺序有关,用工具:mp4info.exe可以查看mp4文件的结构信息: ...
- jQuery的页面加载完毕事件?
很多时候我们需要获取元素,但是必须等到该元素被加载完成后才能获取.我们可以把js代码放到该元素的后面,但是这样就会造成js在我们的body中存在不好管理.所有页面加载完毕后所有的元素当然已经加载完毕. ...
- vue 判断页面加载完成_在Vue+webpack中详细讲解基础配置
这篇文章主要介绍了Vue+webpack项目基础配置教程,需要的朋友可以参考下. 最近在学习webpack,跟着课程一个单页面应用,在这里记录一下. 这个部分主要讲了如何配置webpack的环境,以及 ...
- 【MFC】在CHtmlView中准确判断页面加载完成
以前的方法繁琐,这里抄了别人的方法,做了简单修改.记录下. 首先要在CHtmlView的子类中,重载如下函数: virtual void DocumentComplete(LPDISPATCH pDi ...
- html页面加载完成后会触发的事件_前端隐秘角落 - 页面渲染
前言 如图所示,webkit内核浏览器的渲染过程(解析HTML,构建DOM树,解析CSS,构建CSSOM树 ,构建render树,布局layout,绘制painting),这些过程理解起来可能有些抽象 ...
- 页面加载后如何使JavaScript执行?
我正在使用<head>内的<script>执行外部脚本. 现在,由于脚本是在页面加载之前执行的,因此我无法访问<body> . 在文档"加载"后 ...
- WebBrowser控件判断完全加载中DocumentCompleted和Navigated的关系
WebBrowser控件判断完全加载使用DocumentCompleted是有问题的,所以有人提出可以使用判断DocumentCompleted的次数和Navigated次数完全相等的方法判断是否完全 ...
- $function(){}页面加载函数全局和局部的问题和如何给a标签或者其他标签在ajax中异步绑定事件出现异步的问题
<div class="container"><div class="left"></div><div class=& ...
- 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 3
备注: 因为文章太长,所以将它分为三部分,本文是第三部分. 第一部分:深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1 第二部分:深入浅出经典面试题:从浏览器中输入URL ...
- android 刷新某条数据_Android 支持刷新、加载更多、带反弹效果的RecyclerView
点击上方"Android技术杂货铺",选择"标星" 干货文章,第一时间送达! 开篇 当前市面上很多支持刷新.加载更多RecyclerView开源库,为何我这里还 ...
最新文章
- 科普大V河森堡:用科学的方法回答哲学问题
- 不知道这些肯定没学过Go语言
- Mansory算法分析
- 小块头大性能才能得到用户的青睐
- 第八届蓝桥杯决赛 磁砖样式
- 数据追加用什么函数_RL用算法发现算法:DeepMind 数据驱动「价值函数」自我更新,14款Atari游戏完虐人类!...
- Java与.net的区别delegate和event
- php 三色排序,一个数组中只有0,1,2三种元素,要求对这样的数组进行排序,一个数组中只有0,1,2三种元素,要求对这样的数组进行排序,第2章 排序 | | 第17节 三色排序练习题...
- 虚拟云服务器 网站备案,云虚拟主机可以做备案吗
- 汇编实现时钟设置代码理解
- 奇迹单机版服务器修改,大天使之剑奇迹网页游戏 一键服务端单机版/架设教程/修改方法...
- w10系统打不开服务器共享打印机,共享打印机拒绝访问怎么办?Win10打印机无法共享的解决办法...
- 第35讲:Xposed+模拟器的详细使用
- 【磨刀不误砍柴工】(SCH-1217) Could not open “XXschematic“ for edit. Would you like to open it for read?问题。
- QGIS二次开发2:添加矢量、栅格图层及图层列表的实现
- Laravel中pluck的使用——返回指定的字段值信息列表
- 计算机编程课是学什么的,编程是什么课程
- 史济怀20180915_1 有限覆盖定理
- 如何在安卓手机上编辑Excel表格?
- 点赞转发双10w+,这些视频号如何打造爆款?
热门文章
- Linux的dev目录被删除,详解Linux系统下的/dev目录
- oracle 12c transaction guard,保障业务连续性的神器
- 增益带宽积(GBWP、GBW、GBP、GB)
- MATLAB的sum函数
- php中联合运算符,PHP-串联运算符
- 橡胶柱压缩_橡胶=汽车半条命:浅谈ABAQUS橡胶大变形仿真5大注意事项
- OraclePLSQL 安装及乱码问题解决
- 修炼Python基础篇-字典(Dictionary)学习
- 11G新特性 -- Expression Statistics
- 安装布署rsync+Inotify实现数据的实时同步更新