有时候我们想在应用程序中拦截某个IE窗口的事件,大多数情况下我们会想到BHO,但BHO安装不方便,而且容易被杀毒软件当作木马给清理掉。其实,在VB里还有更好的办法,就是使用ShellWindows对象。下面,我基于ShellWindows对象写了一个简单的IE窗口事件监控类,代码如下:

'* ************************************** * '* 类名称:IEHooker '* 类功能:监控IE窗口打开和关闭事件 '* 作者:lyserver '* 备注:需要引用Microsoft Internet Controls类库 '* ************************************** *Option ExplicitDim WithEvents m_shWindows As ShellWindows Dim m_objIE() As InternetExplorer Dim m_nIeCount As Long'- ----------------------------------- ' 过程说明:类初始化 '- ----------------------------------- Private Sub Class_Initialize()Dim objIE As InternetExplorer'加入已打开的IE对象到数组中Set m_shWindows = New ShellWindowsFor Each objIE In m_shWindowsIf InStr(objIE.FullName, "/iexplore.exe") ThenReDim Preserve m_objIE(m_nIeCount)Set m_objIE(m_nIeCount) = objIEm_nIeCount = m_nIeCount + 1End IfNext End Sub'- ----------------------------------- ' 过程说明:类销毁 '- ----------------------------------- Private Sub Class_Terminate()Dim i As Long'销毁数组For i = 0 To m_nIeCount - 1Set m_objIE(i) = NothingNextErase m_objIE End Sub'- ----------------------------------- ' 过程说明:IE窗口打开事件 '- ----------------------------------- Private Sub m_shWindows_WindowRegistered(ByVal lCookie As Long)'加入将要打开的IE对象到数组中If InStr(m_shWindows.Item.FullName, "/iexplore.exe") = 0 Then Exit SubReDim Preserve m_objIE(m_nIeCount)Set m_objIE(m_nIeCount) = m_shWindows.Itemm_nIeCount = m_nIeCount + 1 End Sub'- ----------------------------------- ' 过程说明:IE窗口关闭事件 '- ----------------------------------- Private Sub m_shWindows_WindowRevoked(ByVal lCookie As Long)Dim i As LongDim blnFound As Boolean'从数组中移出将要关闭的IE对象If InStr(m_shWindows.Item.FullName, "/iexplore.exe") = 0 Then Exit SubFor i = 0 To m_nIeCount - 1If m_objIE(i).hWnd = m_shWindows.Item.hWnd Then blnFound = TrueIf blnFound ThenIf i = m_nIeCount - 1 Then Exit ForSet m_objIE(i) = m_objIE(i + 1)End IfNextm_nIeCount = m_nIeCount - 1If m_nIeCount > 0 Then ReDim Preserve m_objIE(m_nIeCount - 1) End Sub

测试代码如下:

Dim objIeHooker As IeHookerPrivate Sub Form_Load()Set objIeHooker = New IeHooker End SubPrivate Sub Form_Unload(Cancel As Integer)Set objIeHooker = Nothing End Sub

该类只是一个示例,没有实现更多事件的监控,大家可以在这个类的基础上,基于DOM添加自己需要监控的事件,比如拦截右键菜单。为了拦截DOM事件,需要添加一个事件类,代码如下:

'* ************************************** * '* 类名称:IEEvent '* 类功能:IE事件类 '* 作者:lyserver '* 备注:需要引用Microsoft Internet Controls '* 和Microsoft HTML Object Library类库 '* ************************************** *Option Explicit Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As LongPublic WithEvents m_objIE As InternetExplorer Public WithEvents m_objDoc As HTMLDocument'- ----------------------------------- ' 过程说明:类初始化 '- ----------------------------------- Private Sub Class_Initialize()' End Sub'- ----------------------------------- ' 过程说明:类销毁 '- ----------------------------------- Private Sub Class_Terminate()Set m_objDoc = NothingSet m_objIE = Nothing End Sub'- ----------------------------------- ' 函数说明:IE文档右键菜单事件 '- ----------------------------------- Private Function m_objDoc_oncontextmenu() As BooleanMessageBox m_objIE.hwnd, "IE的右键菜单被拦截了", "测试", 0m_objDoc_oncontextmenu = True '继续显示右键菜单 End Function'- ----------------------------------- ' 过程说明:IE文档加载完成事件 '- ----------------------------------- Private Sub m_objIE_DocumentComplete(ByVal pDisp As Object, URL As Variant)Set m_objDoc = m_objIE.Document End Sub'- ----------------------------------- ' 过程说明:IE窗口关闭事件 '- ----------------------------------- Private Sub m_objIE_OnQuit()Set m_objIE = Nothing End Sub

事件监控类代码修改如下:

'* ************************************** * '* 类名称:IEHooker '* 类功能:IE事件监控类 '* 作者:lyserver '* 备注:需要引用Microsoft Internet Controls类库 '* ************************************** *Option ExplicitDim WithEvents m_shWindows As ShellWindows Dim m_ieEvent() As IEEvent Dim m_nIeCount As Long'- ----------------------------------- ' 过程说明:类初始化 '- ----------------------------------- Private Sub Class_Initialize()Dim objIE As InternetExplorer'加入已打开的IE对象到数组中Set m_shWindows = New ShellWindowsFor Each objIE In m_shWindowsIf InStr(objIE.FullName, "/iexplore.exe") ThenReDim Preserve m_ieEvent(m_nIeCount)Set m_ieEvent(m_nIeCount) = New IEEventSet m_ieEvent(m_nIeCount).m_objIE = objIESet m_ieEvent(m_nIeCount).m_objDoc = objIE.Documentm_nIeCount = m_nIeCount + 1End IfNext End Sub'- ----------------------------------- ' 过程说明:类销毁 '- ----------------------------------- Private Sub Class_Terminate()Dim i As Long'销毁数组For i = 0 To m_nIeCount - 1Set m_ieEvent(i) = NothingNextErase m_ieEvent End Sub'- ----------------------------------- ' 过程说明:IE窗口打开事件 '- ----------------------------------- Private Sub m_shWindows_WindowRegistered(ByVal lCookie As Long)Dim objIE As InternetExplorer'加入将要打开的IE对象到数组中Set objIE = m_shWindows(m_shWindows.Count - 1)If InStr(objIE.FullName, "/iexplore.exe") = 0 Then Exit SubReDim Preserve m_ieEvent(m_nIeCount)Set m_ieEvent(m_nIeCount) = New IEEventSet m_ieEvent(m_nIeCount).m_objIE = objIEm_nIeCount = m_nIeCount + 1 End Sub'- ----------------------------------- ' 过程说明:IE窗口关闭事件 '- ----------------------------------- Private Sub m_shWindows_WindowRevoked(ByVal lCookie As Long)Dim i As LongDim blnFound As Boolean'从数组中移出将要关闭的IE对象For i = 0 To m_nIeCount - 1If m_ieEvent(i).m_objIE Is Nothing Then blnFound = TrueIf blnFound ThenIf i = m_nIeCount - 1 Then Exit ForSet m_ieEvent(i) = m_ieEvent(i + 1)End IfNextm_nIeCount = m_nIeCount - 1If m_nIeCount > 0 Then ReDim Preserve m_ieEvent(m_nIeCount - 1) End Sub

测试代码不变。

当工程运行后,无论在哪一个IE窗口的HTML文档区按右键,均会先弹出一个对话框,然后才出现菜单。

不使用BHO监控IE窗口事件相关推荐

  1. QT中父子窗口事件传递与事件过滤器

    处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...

  2. JavaScript的文档窗口事件

    文档窗口事件 Load 当指定的元素已加载时,触发 Resize 当调整浏览器窗口大小时,触发 Scroll 当用户滚动指定的元素时,触发 适用于所有可滚动的元素,window对象浏览器窗口 Unlo ...

  3. shell sqlplus执行sql文_如何通过 Shell 监控异常等待事件和活跃会话

    作者 | JiekeXu 来源 | JiekeXu之路(ID: JiekeXu_IT) 转载请联系授权 | (微信ID:xxq1426321293) 大家好,我是 JiekeXu,分开这么久很高兴又和 ...

  4. 如何通过 Shell 监控异常等待事件和活跃会话

    前几天有网友在墨天轮平台上问到"如何写一个定时任务监控用户会话连接数"的问题,由于当时比较忙,回答的比较简单也比较匆忙.最近也因为公司新项目老是加班,运维保障,安装 RAC.搭建 ...

  5. Java-MQTT客户端监控连接状态事件

    MQTT客户端监控连接状态事件 项目采用paho.mqtt.java客户端,需要监控连接状态变更事件,以进行异常维测和处理. 代码中提供了MqttCallback接口如下: org.eclipse.p ...

  6. 气象站可以用计算机分析什么数据,自动气象站监控软件窗口显示信息分析与应用...

    [摘 要]自动气象站监控软件(SAWSS)是自动气象站采集器与计算机的接口软件.其主要功能是对采集器进行控制:将采集器中的数据调取到计算机中,显示在实时数据监测窗口,形成各种规定的采集文件和实时传输数 ...

  7. php 文本框事件,jQuery监控文本框事件并处理步骤详解

    这次给大家带来jQuery监控文本框事件并处理步骤详解,使用jQuery监控文本框事件的注意事项有哪些,下面就是实战案例,一起来看一下.//事情委托 $(document) .on('input pr ...

  8. 常用的事件(包括键盘事件,文本框事件,窗口事件)

    键盘事件 // 键盘事件 // onkeydown 键盘按下 // onkeypress; 键盘按着不放时 // onkeyup 键盘按下后抬起触发 文本框事件 // onchange 内容发生改变并 ...

  9. PowerBuilder学习笔记(窗口事件和函数)

    一.窗口事件: 1.Open事件 在窗口打开后.显示前发生,系统已经构造好了窗口的所有属性和所有控件. Open(),OpenSheet()等函数会触发此事件. 2.Close事件 在窗口被关闭时发生 ...

  10. VC浏览器相关的学习(七)(BHO捕获鼠标键盘事件)

    原本想暂时将BHO放放,结果发现了IDispEventImpl 的基类 IDispEventSimpleImpl,原来真正牛逼的方法都在这里呢. 0 #include <mshtmdid.h&g ...

最新文章

  1. redis字符串匹配_Redis的数据类型和抽象概念介绍
  2. 深入理解空间搜索算法 ——数百万数据中的瞬时搜索
  3. Geoserver怎样发布图层组(shapefile文件)
  4. Google的三篇大数据思想论文
  5. vue获取商品数据接口_基于 request cache 请求缓存技术优化批量商品数据查询接口...
  6. 私有云存储 linux,搭建nextcloud私有云存储网盘
  7. Linux 的 chmod 命令,对一个目录及其子目录所有文件添加权限
  8. openlayers 中的一些方法
  9. OpenShift 4 Hands-on Lab (10) 限制集群资源的使用量
  10. (转)从开发小白到音视频专家
  11. stl Vecotr中遍历方法
  12. Android中图片大小和屏幕密度的关系讲解
  13. ollydebug+C32Asm
  14. 五角星符号怎么打出来
  15. 瓴羊DAAS闪耀云栖大会,发布数字化时代最优解
  16. 【C++】Placement New
  17. 【Linux命令篇】正则表达式浅析
  18. 性能篇 | 17 | jmeter | BeanShell内置变量prev的使用技巧
  19. C / C ++和应用程序中的INT_MAX和INT_MIN
  20. 《ESP8266学习笔记》之 采用定时器内的按键扫描方法,摒弃传统的延时按键消抖

热门文章

  1. P5960 【模板】差分约束算法 · spfa
  2. ps读写ddr3里面的数据 zynq_DDR3读写数据调试
  3. 文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)
  4. 前端 js中图片地址转base64(简单好用)
  5. 国密Fabric-ca集群负载均衡
  6. win7共享网络的方法简述
  7. 数十位院士/大咖亮相,近千人到场交流,物联网人年终必聚的产业盛会来了!...
  8. 客户合并修改需求 @熊哥
  9. HDU 4313 最小生成树
  10. 最小二乘(OLS)回归法及其在R中的…