如何在TWebbrowser控件中屏蔽鼠标右击功能?(80分)

  • 主题发起人 主题发起人 wzcyc1
  • 开始时间 开始时间
可以自己加事件,不过很麻烦,还是用embeddedWb吧,可以直接做到。
 
从MSDN里可以知道,要使用浏览器中的高级UI接口,自己必须实现这些接口,你可以自己实现
IDocHostUIHandler接口,这个接口的定义可以自己参照VC的定义来写,然后自己用Delphi
来实现这个接口,这就可以加入你要要干的任何事情,我前久也是在研究这个,最后终于实现了
:〕
 
这里有代码:

http://download.microsoft.com/download/vc50pro/sample5/1/W9XNT4/EN-US/WBCustom.exe

http://www.applevb.com
 
要屏蔽掉右键菜单,只要实现IDocHostUIHandler.ShowContexMenu返回S_OK就可以了,你必须
自己实现这个接口,接口定义我这里有,如果感兴趣可以e-mail给我gfzhx@21cn.com,另外你
还必须使用ICustomDoc接口,用这个接口的SetUIHandler来设置Document的IDocHostUIHandler
这个接口的定义Delphi中没有,只能参照MSDN来自己写,我这里也有哦!从MSDN中可以知道
这个方法是专门提供给那些不能编写接口的语言的,像VB和VBS之类的语言的,我自己实现后
发现只要重新浏览新的页面时,就要重新设置一次,很麻烦,你也可以参考MSDN里的另一种发法
先实现IOleClientSite接口,然后再实现IDocHostUIHandler接口,我是没有成功,但你可以参看
embeddedWb的实现方法,用TWebBrowser控件很难实现,要不就要改写TWebBrowser啦。
 
to menxin:
embeddedWb在哪里找?
to louts:
使用API能否解决问题?
 
API是不行的,但你可以用Document的事件来过滤这个事件,但又要你来实现两个接口了,是自动化对象
的事件连接对象(我不太记得清楚了),这样一来,你就可以像JavaScript一样来控制Document对象的
事件了,不过还是实现IDocHostUIHandler接口来得方便。只要你有接口说明文件(得自己写啦),那
实现就是很简单的啦!
 
IDocHostUIHandler能用VB实现吗?或者通过VB可以调用IDocHostUIHandler经过
处理的控件吗?是否能给出例子,让我易于掌握。
 
好像不行,因为IDocHostUIHandler接口是直接从IUnknow接口继承过来的,VB是不能编写这个接口
的。不过VB是可以调用用其他语言实现了这个接口的控件,像上文所说的微软的例子
http://download.microsoft.com/download/vc50pro/sample5/1/W9XNT4/EN-US/WBCustom.exe
就是用VC写的COM,然后用VB调用,VB在这些底层的编程上就没有优势啦!不过Delphi可以写这个
接口的,其实很简单,只要你有接口说明文件。这是embeddedWb控件中的接口说明,
IDocHostUIHandler = interface(IUnknown)
['{bd3f23c0-d43e-11cf-893b-00aa00bdce1a}']
function ShowContextMenu(const dwID: DWORD; const ppt: PPOINT;
const pcmdtReserved: IUnknown; const pdispReserved: IDispatch): HRESULT; stdcall;
function GetHostInfo(var pInfo: TDOCHOSTUIINFO): HRESULT; stdcall;
function ShowUI(const dwID: DWORD; const pActiveObject: IOleInPlaceActiveObject;
const pCommandTarget: IOleCommandTarget; const pFrame: IOleInPlaceFrame;
const pDoc: IOleInPlaceUIWindow): HRESULT; stdcall;
function HideUI: HRESULT; stdcall;
function UpdateUI: HRESULT; stdcall;
function EnableModeless(const fEnable: BOOL): HRESULT; stdcall;
function OnDocWindowActivate(const fActivate: BOOL): HRESULT; stdcall;
function OnFrameWindowActivate(const fActivate: BOOL): HRESULT; stdcall;
function ResizeBorder(const prcBorder: PRECT;
const pUIWindow: IOleInPlaceUIWindow;
const fRameWindow: BOOL): HRESULT; stdcall;
function TranslateAccelerator(const lpMsg: PMSG; const pguidCmdGroup: PGUID;
const nCmdID: DWORD): HRESULT; stdcall;
function GetOptionKeyPath(var pchKey: POLESTR; const dw: DWORD): HRESULT; stdcall;
function GetDropTarget(const pDropTarget: IDropTarget;
out ppDropTarget: IDropTarget): HRESULT; stdcall;
function GetExternal(out ppDispatch: IDispatch): HRESULT; stdcall;
function TranslateUrl(const dwTranslate: DWORD; const pchURLIn: POLESTR;
var ppchURLOut: POLESTR): HRESULT; stdcall;
function FilterDataObject(const pDO: IDataObject;
out ppDORet: IDataObject): HRESULT; stdcall;
end; // IDocHostUIHandler

然后是实现这个接口啦!
TDocHostUIHandler = calss (TInterfacedObject,IDocHostUIHandler)
public
ShowContextMenu......
然后实现这个接口就可以啦,这是关键,具体详情你得去查MSDN啦!
还有就是要实现ICustomDoc接口,这样你才能设置IDocHostUIHandler接口。
 
多人接受答案了。
 
后退
顶部