VB:屏蔽IE的右键菜单

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

         关于BHO的文章现在已经很多了,对BHO就不做介绍了。

        原理是利用在BHO中维护一个IWebbrowser2接口,然后通过这个接口获得一个IHTMLDocument2接口,然后通过这个接口获得ICustomDoc 接口,然后通过ICustomDoc 接口的SetUIHandle方法将自己的IDocHostUIHandler实现连接到IE上面

  下面说说要点:

   1    BHO只要实现IObjectWithSite接口即可,而获得IWebbrowser2接口的时机毫无疑问应该是在IObjectWithSite_SetSite中

  2   获得IHTMLDocument2接口的时机我选择了IWebbrowser2的DocumentComplete事件,这也是通常的做法,但不是最明智的方法,明智的做法应该是由IConnectionPoint接口去通知IWebbrowser2它对某个事件比较感兴趣

  3  由于只是屏蔽右键菜单,所以只处理了IDocHostUIHandler_ShowContextMenu,对于其它不需处理的地方尽管理论上只需返回HRESULT即可,但遗憾的是VB没法直接返回HRESULT,于是通过Err.Raise E_NOTIMPL处理了一下。但更加遗憾的是,如果不对声明进行处理,它会更不给你面子,你不知道何时你的程序会崩溃。更加更加遗憾的是由于放火墙频繁重起,导致我现在心情不好,实在不愿意干这个费力气的活,所以留到以后再说吧

好了,不废话了,下面给出代码:

'首先引用:Edanmo's OLE interfaces for Implements v1.51,Edanmo's OLE interfaces & functions v1.81, Microsoft Internet Controls,VB Shell Library

Option Explicit
'马畅(rainstormmaster)的游戏之作,虽然有很多问题,但转载请保留上述信息


'接口
Implements VBShellLib.IObjectWithSite
Implements olelib.IDocHostUIHandler

'声明
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

' private variables
Private moUnknown As IUnknownVB
Private WithEvents moBrowser As InternetExplorer
Private mDOC As olelib.ICustomDoc
Private mShow As Boolean
'这个不处理也行
Private Sub IObjectWithSite_GetSite(ByVal priid As VBShellLib.REFIID, ppvObj As VBShellLib.VOID)

   ' 返回我们已经得到的接口
   If Not (moUnknown Is Nothing) Then
      moUnknown.QueryInterface priid, ppvObj
   End If

End Sub

' 这个必须处理,获得IE的IWebbrowser2接口
Private Sub IObjectWithSite_SetSite(ByVal pSite As VBShellLib.IUnknownVB)

   Set moUnknown = pSite
   '用不着了,就释放掉
   If ObjPtr(pSite) = 0 Then
      CopyMemory moBrowser, 0&, 4
   Else
      '获得IE的IWebbrowser2接口
      Set moBrowser = moUnknown
   End If

End Sub


'通过ICustomDoc接口挂接IDocHostUIHandler接口
Private Sub moBrowser_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    '获得ICustomDoc接口
    Set mDOC = moBrowser.document
    '挂接IDocHostUIHandler接口
    mDOC.SetUIHandler Me
End Sub
'以下基本都没做处理,由于VB没法直接返回HRESULT,所以用Err.Raise E_NOTIMPL处理了
'一下,需要注意的是:这里有隐患(可以通过自己修改ODL解决,不过这是个费力气
'的活,以后心情好再说吧),在IDE中调试可能会引起崩溃
Private Sub IDocHostUIHandler_EnableModeless(ByVal fEnable As olelib.BOOL)
    Err.Raise E_NOTIMPL
End Sub

Private Function IDocHostUIHandler_FilterDataObject(ByVal pDO As olelib.IDataObject) As olelib.IDataObject
    Err.Raise E_NOTIMPL
End Function

Private Function IDocHostUIHandler_GetDropTarget(ByVal pDropTarget As olelib.IDropTarget) As olelib.IDropTarget
    Err.Raise E_NOTIMPL
End Function

Private Function IDocHostUIHandler_GetExternal() As Object
    Err.Raise E_NOTIMPL
End Function

Private Sub IDocHostUIHandler_GetHostInfo(pInfo As olelib.DOCHOSTUIINFO)
    Err.Raise E_NOTIMPL
End Sub

Private Sub IDocHostUIHandler_GetOptionKeyPath(pOLESTRchKey As Long, ByVal dw As Long)
    Err.Raise E_NOTIMPL
End Sub

Private Sub IDocHostUIHandler_HideUI()
    Err.Raise E_NOTIMPL
End Sub

Private Sub IDocHostUIHandler_OnDocWindowActivate(ByVal fActivate As olelib.BOOL)
     Err.Raise E_NOTIMPL
End Sub

Private Sub IDocHostUIHandler_OnFrameWindowActivate(ByVal fActivate As olelib.BOOL)
    Err.Raise E_NOTIMPL
End Sub

Private Sub IDocHostUIHandler_ResizeBorder(prcBorder As olelib.RECT, ByVal pUIWindow As olelib.IOleInPlaceUIWindow, ByVal fRameWindow As olelib.BOOL)
    Err.Raise E_NOTIMPL
End Sub
'唯一做出处理的地方,屏蔽IE的右键菜单
Private Sub IDocHostUIHandler_ShowContextMenu(ByVal dwContext As olelib.ContextMenuTarget, pPOINT As olelib.POINT, ByVal pCommandTarget As olelib.IOleCommandTarget, ByVal HTMLTagElement As Object)
    If mShow = True Then
        IDocHostUIHandler.ShowContextMenu dwContext, pPOINT, pCommandTarget, HTMLTagElement
    End If
End Sub

Private Sub IDocHostUIHandler_ShowUI(ByVal dwID As Long, ByVal pActiveObject As olelib.IOleInPlaceActiveObject, ByVal pCommandTarget As olelib.IOleCommandTarget, ByVal pFrame As olelib.IOleInPlaceFrame, ByVal pDoc As olelib.IOleInPlaceUIWindow)
    Err.Raise E_NOTIMPL
End Sub

Private Sub IDocHostUIHandler_TranslateAccelerator(lpmsg As olelib.MSG, pguidCmdGroup As olelib.UUID, ByVal nCmdID As Long)
    Err.Raise E_NOTIMPL
End Sub

Private Function IDocHostUIHandler_TranslateUrl(ByVal dwTranslate As Long, ByVal pchURLIn As Long) As Long
    Err.Raise E_NOTIMPL
End Function

Private Sub IDocHostUIHandler_UpdateUI()
    Err.Raise E_NOTIMPL
End Sub

编译后用regsvr32注册dll,然后用oleview看看它的GUID,然后打开记事本写入如下内容:

REGEDIT4

#
# browser helper object - register the DLL first
# template GUID: D5B72AED-E54A-11D6-B1B2-444553540000
#

[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Explorer/Browser Helper Objects]
[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Explorer/Browser Helper Objects/{D5B72AED-E54A-11D6-B1B2-444553540000}]
注意,要把上面的D5B72AED-E54A-11D6-B1B2-444553540000换成你的GUID

然后,保存为reg文件,最后将reg文件导入注册表

注销的话,reg文件对应内容为:

REGEDIT4

#
# browser helper object - register the DLL first
# template GUID: D5B72AED-E54A-11D6-B1B2-444553540000
#

[-HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Explorer/Browser Helper Objects/{D5B72AED-E54A-11D6-B1B2-444553540000}]

同样,注意用你的GUID去换掉原来的D5B72AED-E54A-11D6-B1B2-444553540000    

 
Edanmo's OLE interfaces & functions Edanmo's OLE interfaces & functions v1.4 立即下载

相关推荐

vb禁用鼠标右键,vb鼠标右键不能用,vb屏蔽鼠标右键

vb禁用鼠标右键,vb鼠标右键不能用,vb屏蔽鼠标右键

Edanmo's OLE interfaces & functions v1.4

Edanmo's OLE interfaces & functions v1.4 找了很久才找到,特此与大家分享!

vb WebBrowser屏蔽右键

vb WebBrowser屏蔽右键 vb WebBrowser屏蔽右键

IDocHostUIHandler::TranslateAccelerator快捷键不响应解决办法(即ctrl+c, ctrl+v不起作用解决办法)

ctrl+c, ctrl+v不起作用的时候, 如果使用的是CHtmlView, 那么是它的一个BUG, 在资源文件中加入以下内容可以解决:///////////////////////////////////////////////////////////////////////////// // // Accelerator // IDC_XTPRO2 ACCELERATORS BEG

sgzwiz的专栏 4103

Internet Explorer 编程简述(六)自定义浏览器上下文菜单

关键字:WebBrowser, Internet Explorer, Custom Context Menu, ShowContextMenu, IDocHostUIHandler1、概述Internet Explorer提供了非常开发的接口,使开发人员不仅可以把其浏览器核心嵌入应用程序,还可以通过各种接口以实现更深层的控制。本文就将介绍对浏览器进行高级控制的话题之一——自定义上下文菜单

eagleboost's blog 1万+

IDocHostUIHandler::ShowContextMenu添加自定义菜单的另类实现

这里有两种另类的实现方式: 第一种是使用SetWindowLong,接管WndProc,一切尽在接管之中。 第二种是在自己的程序中添加相应的菜单ITEM,弹出菜单后,接管一些ITEM点击事件。 第二种方法的详细实现:   STDMETHODIMP CMyDocHostUIHandler::ShowContextMenu(DWORD dwID, POINT* ppt, IUnknown*

fuxiucheng的专栏 1089

IUnknown

VB6拾遗:IUnknown接口与COM对象 http://demon.tw/programming/vb6-repick-iunknown-com.html VB6是建立在COM之上的,所有的COM对象都必须实现IUnknown接口。 IUnknown接口的IDL定义如下: VB6是建立在COM之上的,所有的COM对象都必须实现IUnknown接口。 IUnknown接

yiyiyicz的专栏 2898

屏蔽WebBrower控件右键菜单技巧合集

1.常被人鄙视的方法(PreTranslateMessage) 经常见到有人问怎么屏蔽html的右键菜单,有人答用PreTranslateMessage函数拦截wm_rbuttondown消息,于是总会有人说这种方法怎么烂,@_@,我真不知道为什么,不过我想这也是一种方法呀,而且非常简单,所以还是列出来吧:)BOOL CPreTranslateMsgView::PreTranslate

sssxueren的专栏 2459

关于mfc中的屏蔽右键菜单

怎么屏蔽html的右键菜单,有人答用PreTranslateMessage函数拦截wm_rbuttondown消息,于是总会有人说这种方法怎么烂,@_@,我真不知道为什么,不过我想这也是一种方法呀,而且非常简单,所以还是列出来吧:) BOOL CPreTranslateMsgView::PreTranslateMessage(MSG* pMsg) { if ((pMsg->messag

niuweixing007的专栏 5283

屏蔽CHtmlView/WebBrower控件右键菜单技巧合集

0.本文代码下载(http://skinart.y365.com/csdn/htmlcontextmenu.zip)(代码只是做演示用,没有做什么错误检查,请注意)1.常被人鄙视的方法(PreTranslateMessage)经常见到有人问怎么屏蔽html的右键菜单,有人答用PreTranslateMessage函数拦截wm_rbuttondown消息,于是总会有人说这种方法怎么烂,@_@

kingcom_xu的专栏 3212

屏蔽CHtmlView\WebBrower控件右键菜单技巧合集

1.常被人鄙视的方法(PreTranslateMessage) 经常见到有人问怎么屏蔽html的右键菜单,有人答用PreTranslateMessage函数拦截wm_rbuttondown消息,于是总会有人说这种方法怎么烂,@_@,我真不知道为什么,不过我想这也是一种方法呀

把握自己。 2817

Edanmo's OLE interfaces & functions v1.81

这个是v1.81的下载地址,寻找起来非常不容易,可惜文档很少,宝剑在手苦于没有简谱,谁要是能有完整的说明文档或者示例代码请在下面留言告之地址,谢谢! Edanmo's OLE interfaces & functions v1.4 下载地址为https://download.csdn.net/download/sysdzw/2652292

利用COM的连接点机制,直接处理html元素的事件

我们先看看在VB中想屏蔽右键菜单是怎么做的:  Dim WithEvents m_doc As HTMLDocument  Private Function m_doc_oncontextmenu() As Boolean       m_doc_oncontextmenu = False  End Function  Private Sub WebBrowser1_Dow

CZQing_ze的专栏 1269
上一篇: VB6:自定义控件如何设置默认属性
下一篇: VB:如何读出unicode编码的txt文件内容
rainstormmaster
博客等级 码龄23年 603粉丝 12原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值