上次写了WebBrowser这个容器( 详细参看:http://blog.csdn.net/norsd/archive/2008/09/13/2921389.aspx)
今天来说说如何在 WebBrowser的基础上扩展更多的功能.
WebBrowserEx : public WebBrowser , public IDocHostUIHandler
1.实现IDocHostUIHandler接口
WebBrowserEx 继承了WebBrowser ,并且加入了IDocHostUIHandler, 该接口可以个性化WB控件, 同样的必须事先实现IDocHostUIHandle
WebBrowserEx .h 部分
-
-
virtualHRESULTSTDMETHODCALLTYPEShowContextMenu(
-
DWORDdwID,
-
POINT*ppt,
-
IUnknown*pcmdtReserved,
-
IDispatch*pdispReserved);
-
virtualHRESULTSTDMETHODCALLTYPEGetHostInfo(
-
DOCHOSTUIINFO*pInfo);
-
virtualHRESULTSTDMETHODCALLTYPEShowUI(
-
DWORDdwID,
-
IOleInPlaceActiveObject*pActiveObject,
-
IOleCommandTarget*pCommandTarget,
-
IOleInPlaceFrame*pFrame,
-
IOleInPlaceUIWindow*pDoc);
-
virtualHRESULTSTDMETHODCALLTYPEHideUI(void);
-
virtualHRESULTSTDMETHODCALLTYPEUpdateUI(void);
-
-
-
-
virtualHRESULTSTDMETHODCALLTYPEOnDocWindowActivate(
-
BOOLfActivate);
-
virtualHRESULTSTDMETHODCALLTYPEOnFrameWindowActivate(
-
BOOLfActivate);
-
virtualHRESULTSTDMETHODCALLTYPEResizeBorder(
-
LPCRECTprcBorder,
-
IOleInPlaceUIWindow*pUIWindow,
-
BOOLfRameWindow);
-
virtualHRESULTSTDMETHODCALLTYPETranslateAccelerator(
-
LPMSGlpMsg,
-
constGUID*pguidCmdGroup,
-
DWORDnCmdID);
-
virtualHRESULTSTDMETHODCALLTYPEGetOptionKeyPath(
-
LPOLESTR*pchKey,
-
DWORDdw);
-
virtualHRESULTSTDMETHODCALLTYPEGetDropTarget(
-
IDropTarget*pDropTarget,
-
IDropTarget**ppDropTarget);
-
virtualHRESULTSTDMETHODCALLTYPEGetExternal(
-
IDispatch**ppDispatch);
-
virtualHRESULTSTDMETHODCALLTYPETranslateUrl(
-
DWORDdwTranslate,
-
OLECHAR*pchURLIn,
-
OLECHAR**ppchURLOut);
-
virtualHRESULTSTDMETHODCALLTYPEFilterDataObject(
-
IDataObject*pDO,
-
IDataObject**ppDORet);
WebBrowserEx.cpp 部分
-
-
-
-
-
-
HRESULTWebBrowser::ShowContextMenu(
-
DWORDdwID,
-
POINT*ppt,
-
IUnknown*pcmdtReserved,
-
IDispatch*pdispReserved){returnE_NOTIMPL;}
-
-
HRESULTWebBrowser::GetHostInfo(
-
DOCHOSTUIINFO*pInfo){returnE_NOTIMPL;}
-
-
HRESULTWebBrowser::ShowUI(
-
DWORDdwID,
-
IOleInPlaceActiveObject*pActiveObject,
-
IOleCommandTarget*pCommandTarget,
-
IOleInPlaceFrame*pFrame,
-
IOleInPlaceUIWindow*pDoc){returnE_NOTIMPL;}
-
-
HRESULTWebBrowser::HideUI(void){returnE_NOTIMPL;}
-
-
HRESULTWebBrowser::UpdateUI(void){returnE_NOTIMPL;}
-
-
-
-
-
HRESULTWebBrowser::OnDocWindowActivate(
-
BOOLfActivate){returnE_NOTIMPL;}
-
-
HRESULTWebBrowser::OnFrameWindowActivate(
-
BOOLfActivate){returnE_NOTIMPL;}
-
-
HRESULTWebBrowser::ResizeBorder(
-
LPCRECTprcBorder,
-
IOleInPlaceUIWindow*pUIWindow,
-
BOOLfRameWindow){returnE_NOTIMPL;}
-
-
HRESULTWebBrowser::TranslateAccelerator(
-
LPMSGlpMsg,
-
constGUID*pguidCmdGroup,
-
DWORDnCmdID){returnE_NOTIMPL;}
-
-
HRESULTWebBrowser::GetOptionKeyPath(
-
LPOLESTR*pchKey,
-
DWORDdw){returnE_NOTIMPL;}
-
-
HRESULTWebBrowser::GetDropTarget(
-
IDropTarget*pDropTarget,
-
IDropTarget**ppDropTarget)
-
{
-
returnE_NOTIMPL;
-
-
}
-
-
HRESULTWebBrowser::GetExternal(IDispatch**ppDispatch)
-
{
-
returnE_NOTIMPL;
-
}
-
-
HRESULTWebBrowser::TranslateUrl(
-
DWORDdwTranslate,
-
OLECHAR*pchURLIn,
-
OLECHAR**ppchURLOut){returnE_NOTIMPL;}
-
-
HRESULTWebBrowser::FilterDataObject(
-
IDataObject*pDO,
-
IDataObject**ppDORet){returnE_NOTIMPL;}
-
-
关于如何个性化IDocHostUIHandler 可以看这个:
http://www.vckbase.com/document/viewdoc/?id=1486
很多人在那篇提问如何在SDK的模式下支持IDocHostUIHandler, 我的这篇文章就是一个答案了,
你会慢慢爱上SDK的.
2.拖拽的处理
3.处理HTML的众多Event
在MFC的 HTMLDialog 中, 可以实现诸如 MouseMove 之类的消息, 让我们用SDK实现之.
下面实现了一个简单的事件onmousemove
WebBrowserEx.h 部分:
-
virtualSTDMETHODIMP_(void)DocumentComplete(IDispatch*pDisp,VARIANT*URL);
WebBrowserEx.cpp部分
-
void
-
WebBrowserEx::DocumentComplete(IDispatch*pDisp,VARIANT*URL)
-
{
-
-
IHTMLDocument3*pHtmlDoc3=GetHTMLDocument3();
-
BSTRbsMouseMoveEvent=::SysAllocString(L"onmousemove");
-
pHtmlDoc3->attachEvent(
-
bsMouseMoveEvent,
-
CHtmlEvents::CreateEventObject((EVENT_FUNCTION)WebBrowserEx::OnHtmlMouseMove,0,this));
-
::SysFreeString(bsMouseMoveEvent);
-
-
WebBrowser::DocumentComplete( pDisp, URL );//
掉哦那个基类
-
return;
-
}
关于 CHtmlEvents 这是一个独立的类, CreateEventObject 返回一个IDispatch的实例, 来响应 onmousemove.
其实现类似于MSDN中的相关类.
HtmlEvents.h
-
-
typedefHRESULT(*EVENT_FUNCTION)(LPVOID);
-
classCHtmlEvents:
-
publicIDispatch
-
{
-
public:
-
CHtmlEvents();
-
virtual~CHtmlEvents(void);
-
-
-
virtualSTDMETHODIMPQueryInterface(REFIIDiid,void**ppvObject);
-
virtualSTDMETHODIMP_(ULONG)AddRef();
-
virtualSTDMETHODIMP_(ULONG)Release();
-
-
-
HRESULT_stdcallGetTypeInfoCount(unsignedint*pctinfo);
-
HRESULT_stdcallGetTypeInfo(unsignedintiTInfo,LCIDlcid,ITypeInfoFAR*FAR*ppTInfo);
-
HRESULT_stdcallGetIDsOfNames(REFIIDriid,OLECHARFAR*FAR*rgszNames,unsignedintcNames,LCIDlcid,DISPIDFAR*rgDispId);
-
HRESULT_stdcallInvoke(DISPIDdispIdMember,REFIIDriid,LCIDlcid,WORDwFlags,DISPPARAMSFAR*pDispParams,VARIANTFAR*pVarResult,EXCEPINFOFAR*pExcepInfo,unsignedintFAR*puArgErr);
-
-
-
staticLPDISPATCHCreateEventObject(EVENT_FUNCTIONpFunc,DISPIDid,LPVOIDlpUserData);
-
private:
-
long_lRef;
-
EVENT_FUNCTION_fnEvent;
-
DISPID_id;
-
LPVOID_pUserData;
-
};
-
-
HtmlEvents.cpp
-
#include"HtmlEvents.h"
-
-
-
-
CHtmlEvents::CHtmlEvents()
-
{
-
}
-
-
CHtmlEvents::~CHtmlEvents()
-
{
-
}
-
-
-
-
-
-
-
STDMETHODIMPCHtmlEvents::QueryInterface(REFIIDiid,void**ppvObject)
-
{
-
if(iid==IID_IUnknown||iid==IID_IDispatch)
-
{
-
*ppvObject=this;
-
AddRef();
-
returnS_OK;
-
}
-
returnE_NOTIMPL;
-
}
-
-
STDMETHODIMP_(ULONG)CHtmlEvents::AddRef()
-
{
-
returnInterlockedIncrement(&_lRef);
-
}
-
-
STDMETHODIMP_(ULONG)CHtmlEvents::Release()
-
{
-
return::InterlockedDecrement(&_lRef);
-
}
-
-
-
-
-
-
-
HRESULT_stdcallCHtmlEvents::GetTypeInfoCount(
-
unsignedint*pctinfo)
-
{
-
returnE_NOTIMPL;
-
}
-
-
HRESULT_stdcallCHtmlEvents::GetTypeInfo(
-
unsignedintiTInfo,
-
LCIDlcid,
-
ITypeInfoFAR*FAR*ppTInfo)
-
{
-
returnE_NOTIMPL;
-
}
-
-
HRESULT_stdcallCHtmlEvents::GetIDsOfNames(REFIIDriid,
-
OLECHARFAR*FAR*rgszNames,
-
unsignedintcNames,
-
LCIDlcid,
-
DISPIDFAR*rgDispId
-
)
-
{
-
returnE_NOTIMPL;
-
}
-
HRESULT_stdcallCHtmlEvents::Invoke(
-
DISPIDdispIdMember,
-
REFIIDriid,
-
LCIDlcid,
-
WORDwFlags,
-
DISPPARAMS*pDispParams,
-
VARIANT*pVarResult,
-
EXCEPINFO*pExcepInfo,
-
unsignedint*puArgErr)
-
{
-
if(DISPID_VALUE==dispIdMember)
-
{
-
(_fnEvent)(_pUserData);
-
returnS_OK;
-
}
-
returnE_NOTIMPL;
-
}
-
-
-
-
-
-
-
LPDISPATCHCHtmlEvents::CreateEventObject(EVENT_FUNCTIONpFunc,DISPIDid,LPVOIDlpUserData)
-
{
-
CHtmlEvents*npHE=newCHtmlEvents;
-
npHE->_fnEvent=pFunc;
-
npHE->_id=id;
-
npHE->_pUserData=lpUserData;
-
returnreinterpret_cast<LPDISPATCH>(npHE);
-
};
还有一些诸如window.external 接口的实现因为已经有人说的很详细了,所以不再谈论了.
转自:http://blog.csdn.net/norsd/article/details/2934253
分享到:
相关推荐
扩展了.Net framework中的WebBrowser控件
对c#原有WebBrowser的扩展讲解,适合用于对WebBrowser的扩展开发
最近换了一个工作环境,公司里不能上外网,公用软件库里也没有标签式浏览器,但打开太多ie又太麻烦,于是,一急之下,便自己抽空写了一个,仿Maxthon的,拿来大家共享。
WebBrowser的扩展类,可以加载自定义脚本,c#编写, 用来编写 爬虫 , 自动化测试工具等
对webBrowser控件功能进行了扩展,触发新窗口时,可获得真正的URL
webBrowser扩展浏览器通过JS代码与串口通讯,还有JS代码操作upd,tcp通讯,截图等相关操作本地电脑功能.
C# 扩展的比较完整的WebBrowser控件
ExtendedWebBrowser 扩展C#的webbrowser
精典的C# webbrowser 精典扩展类,源代码,供学习使用
WebBrowser控件使用详解,WebBrowser控件使用详解
vb6_Webbrowser控件使用技巧 1、获得浏览器信息: Private Sub Command1_Click() WebBrowser1.Navigate "http://www.applevb.com" End Sub Private Sub Command2_Click() Dim oWindow Dim oNav Set oWindow ...
1,在项目中引用程序集拓展中的Microsoft.mshtml后,可以在公共控件中找到WebBrowser控件。 2,在窗体中加入三个按钮,然后添加WebBrowser控件,右键控件选属性,设置相应的属性。 3,设置WebBrowser控件的属性 ...
涵盖了几种常用的 webBrowser执行javascript的方法, execScript方式: NavigateScript方式: 其中需要作如下设置 由于visual studio2005 中WebBrowser控件已经实现了IDocHostUIHandler,所以 只要把应用程序属性类的...
WPF AllowsTransparency="True" 使用webbrowser控件,可扩展到使用别的控件。
WebBrowser控件技巧集
WebBrowser Demo WebBrowser DemoWebBrowser
c# 桌面应用 WebBrowser 是IE浏览器内核,目前很多网站不支持了,从国外网站找到一个 谷歌内核的WebBrowser 名字叫 EO.WebBrowser ,比较好用,本文档是他的帮助文档。
WebBrowser.exe 损坏文件,此文件为修复工具。
webbrowser滚动条隐藏
C# WebBrowser 适应你想要的IE版本核心 方便你在内嵌式C/S 更好的体验B/S