前言
本人最近一段时间研究Webbrowser,需要拦截网页的alert弹框并截取弹框内容,查找了很多资料 大都都是C#以及MFC, win32方面资料比较少,为避免遗忘,特意记录。
正文
本人查阅了大量资料,发现需要截取网页Alert弹框需要实现接口IDocHostShowUI中的ShowMessage接口,IDocHostShowUI接口在文档中就一句话描述过:
经过不断查找各种文档 最终发现 是需要在IOleClientSite实现类中继承IDocHostShowUI接口,而Duilib中 实现改接口的地方是 CActivexCtrl控件,因此增加对IDocHostShowUI接口的继承实现,代码如下:
class CActiveXCtrl :
public IOleClientSite,
public IOleInPlaceSiteWindowless,
public IOleControlSite,
public IObjectWithSite,
public IOleContainer,
public IDocHostShowUI //新增对IDocHostShowUI接口实现
{
friend class CActiveXUI;
friend class CActiveXWnd;
public:
CActiveXCtrl();
~CActiveXCtrl();
// IUnknown
STDMETHOD_(ULONG,AddRef)();
STDMETHOD_(ULONG,Release)();
STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject);
// IObjectWithSite
STDMETHOD(SetSite)(IUnknown *pUnkSite);
STDMETHOD(GetSite)(REFIID riid, LPVOID* ppvSite);
// IOleClientSite
STDMETHOD(SaveObject)(void);
STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk);
STDMETHOD(GetContainer)(IOleContainer** ppContainer);
STDMETHOD(ShowObject)(void);
STDMETHOD(OnShowWindow)(BOOL fShow);
STDMETHOD(RequestNewObjectLayout)(void);
// IOleInPlaceSiteWindowless
STDMETHOD(CanWindowlessActivate)(void);
STDMETHOD(GetCapture)(void);
STDMETHOD(SetCapture)(BOOL fCapture);
STDMETHOD(GetFocus)(void);
STDMETHOD(SetFocus)(BOOL fFocus);
STDMETHOD(GetDC)(LPCRECT pRect, DWORD grfFlags, HDC* phDC);
STDMETHOD(ReleaseDC)(HDC hDC);
STDMETHOD(InvalidateRect)(LPCRECT pRect, BOOL fErase);
STDMETHOD(InvalidateRgn)(HRGN hRGN, BOOL fErase);
STDMETHOD(ScrollRect)(INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip);
STDMETHOD(AdjustRect)(LPRECT prc);
STDMETHOD(OnDefWindowMessage)(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult);
// IOleInPlaceSiteEx
STDMETHOD(OnInPlaceActivateEx)(BOOL *pfNoRedraw, DWORD dwFlags);
STDMETHOD(OnInPlaceDeactivateEx)(BOOL fNoRedraw);
STDMETHOD(RequestUIActivate)(void);
// IOleInPlaceSite
STDMETHOD(CanInPlaceActivate)(void);
STDMETHOD(OnInPlaceActivate)(void);
STDMETHOD(OnUIActivate)(void);
STDMETHOD(GetWindowContext)(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo);
STDMETHOD(Scroll)(SIZE scrollExtant);
STDMETHOD(OnUIDeactivate)(BOOL fUndoable);
STDMETHOD(OnInPlaceDeactivate)(void);
STDMETHOD(DiscardUndoState)( void);
STDMETHOD(DeactivateAndUndo)( void);
STDMETHOD(OnPosRectChange)(LPCRECT lprcPosRect);
// IOleWindow
STDMETHOD(GetWindow)(HWND* phwnd);
STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);
// IOleControlSite
STDMETHOD(OnControlInfoChanged)(void);
STDMETHOD(LockInPlaceActive)(BOOL fLock);
STDMETHOD(GetExtendedControl)(IDispatch** ppDisp);
STDMETHOD(TransformCoords)(POINTL* pPtlHimetric, POINTF* pPtfContainer, DWORD dwFlags);
STDMETHOD(TranslateAccelerator)(MSG* pMsg, DWORD grfModifiers);
STDMETHOD(OnFocus)(BOOL fGotFocus);
STDMETHOD(ShowPropertyFrame)(void);
// IOleContainer
STDMETHOD(EnumObjects)(DWORD grfFlags, IEnumUnknown** ppenum);
STDMETHOD(LockContainer)(BOOL fLock);
// IParseDisplayName
STDMETHOD(ParseDisplayName)(IBindCtx* pbc, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut);
//增加对IDocHostShowUI的支持
//IDocHostShowUI
STDMETHOD(ShowHelp)(
/* [in ] */ HWND hwnd,
/* [in ] */ LPOLESTR pszHelpFile,
/* [in ] */ UINT uCommand,
/* [in ] */ DWORD dwData,
/* [in ] */ POINT ptMouse,
/* [out] */ IDispatch __RPC_FAR *pDispatchObjectHit)
{
return S_OK;
}
STDMETHOD(ShowMessage)(
/* [in ] */ HWND hwnd,
/* [in ] */ LPOLESTR lpstrText,
/* [in ] */ LPOLESTR lpstrCaption,
/* [in ] */ DWORD dwType,
/* [in ] */ LPOLESTR lpstrHelpFile,
/* [in ] */ DWORD dwHelpContext,
/* [out] */ LRESULT __RPC_FAR *plResult)
{
DUI__Trace(_T("[Webbrowser]The Message Text is:%s"), lpstrText);
if (m_pOwner)
{
//返回S_OK则不弹框
return m_pOwner->OnShowMessage(hwnd, lpstrText, lpstrCaption, dwType, lpstrHelpFile, dwHelpContext, plResult);
}
//返回S_FALSE不屏蔽
return S_FALSE;
}
protected:
HRESULT CreateActiveXWnd();
protected:
LONG m_dwRef;
CActiveXUI* m_pOwner;
CActiveXWnd* m_pWindow;
IUnknown* m_pUnkSite;
IViewObject* m_pViewObject;
IOleInPlaceObjectWindowless* m_pInPlaceObject;
BOOL m_bLocked;
BOOL m_bFocused;
BOOL m_bCaptured;
BOOL m_bUIActivated;
BOOL m_bInPlaceActive;
BOOL m_bWindowless;
};