当使用WebBrowser,并对其装载的Web页建立Document的事件后,WebBrowser里的页面元素都变得难于操作了,只响应建立的连接事件。有兴趣的朋友可以在您的代码中使用以下的代码来建立事件:
本文相关代码如下:

// 在WebBrowser的DocumentComplete中写下面的代码。
IHTMLDocument2 m_pHtmlDoc2 =  (IHTMLDocument2)ChatInfoWebBrowser.Document;
HTMLDocumentEvents2_Event iEvent = (HTMLDocumentEvents2_Event)m_pHtmlDoc2;
iEvent.oncontextmenu += new HTMLDocumentEvents2_oncontextmenuEventHandler(ContextMenuEventHandler);
// 事件处理函数,目的,不使用WebBrowser自己的菜单。
private bool ContextMenuEventHandler(IHTMLEventObj e)
{
   MessageBox.Show("ContextMenuEventHanderl");
return false;
}

你可以在WebBrowser中打开一个百度的页面,那么,在上面的代码加入后,你会发现,不能操作百度页面上的任何元素,你眼睁睁的看着编辑框中有了焦点,可是,就算你拿锤子敲键盘,编辑框也没有输入任何字符。呵呵,实在是太奇怪的问题了。
   然后就到google上狂搜一通,我的上帝,那么多英文的材料让我头瞬间有2个大,没办法,硬着头皮上了。遇到这种问题的人还真不少,可是,都没有给出解答,后来,看多了,一句话印象深刻,那就是“这是一个公开的bug”,我不知道这时不时bug,毕竟微软官方没有明确说明这是bug,所以,我不敢确认。但是,为什么会出现这样的情况呢?
  一篇文章的作者解释说,当WebBrowser监视了事件后,页面元素将不会接收到事件了,因为Web的DocumentEvent已经被注册了,只要一个事件被注册,WebBrowser就把所有的事件都接受过来,如果我们没有写对应事件的代码,那就忽略掉该事件。
   那么,因为我以前一直用VC写程序,在实现这样的功能时并没有出现这种情况,因为使用的是同一个Dll,所以,我有理由怀疑是VS在C#环境下注册该Dll的引用的时候,可能在转换方面出现了某个致命的问题,导致了并没有释放对DocumentEvent的使用权。所以,可以理解成是一个bug吧。
   废话不多说了,给出该问题的解决方法吧。
   那就是,我们不使用DocumentEvent来实现我们的功能,不去实现C#转换过来的接口。
   OK,请在您的程序中新建一个CS文件,然后把下面的代码复制上去,当然,命名空间随便您改。
本文相关代码如下:

/// programer : ricky
/// DataTime  : 2007-04-16 15:49
/// Rights    : Nanjing Desunsoft CO.,LTD
using System;
using mshtml;
using System.Runtime.InteropServices ;
namespace SimTrade4.ChatRoom
{
   /// <summary>
   /// WebBrowserDocument事件。
   /// </summary>        
   public delegate void DHTMLEvent(IHTMLEventObj e);
   /// <summary>
   /// WebBrowser事件处理类。
   /// </summary>        
   public class CHTMLEventHandler
   {
       /// <summary>
       /// DHTMLEvent事件。
       /// </summary>        
       public DHTMLEvent m_DHTMLEventHandler;
       /// <summary>
       /// HTMLDocument对象。
       /// </summary>        
       private HTMLDocument m_Document;
       /// <summary>
       /// 构造函数。
       /// </summary>        
       public CHTMLEventHandler(HTMLDocument doc)
       {
           m_Document = doc;
       }
       /// <summary>
       /// DispId不能省略,它是Com自动化的重要步骤,所以,当事件触发后,就会
       /// 自动调用该函数。
       /// </summary>        
       [DispId(0)]
       public void FireEvent()
       {
           m_DHTMLEventHandler(m_Document.parentWindow.@event);
       }
   }
}

然后用下面的方式进行调用:
本文相关代码如下:

private void axWebBrowser_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
       {
           HTMLDocument m_pHtmlDoc2 = (HTMLDocument)axWebBrowser.Document;
if (m_pHtmlDoc2 != null)
           {
               // 注册上下文事件。
               CHTMLEventHandler ContextMenuDHandler = new CHTMLEventHandler(m_pHtmlDoc2);
               ContextMenuDHandler.m_DHTMLEventHandler += new DHTMLEvent(ContextMenuEventHandler);
               m_pHtmlDoc2.oncontextmenu = ContextMenuDHandler;
           }
       }
       private void ContextMenuEventHandler(IHTMLEventObj e)
       {
           e.returnValue = false;    // 这样就不会弹出IE菜单了,返回ture就会了。
       }

OK,如果要添加别的事件,比如说单击,可以像下面一样使用:
本文相关代码如下:

// 注册单击事件。
CHTMLEventHandler ClickDHandler = new CHTMLEventHandler(m_pHtmlDoc2);
ClickDHandler.m_DHTMLEventHandler += new DHTMLEvent(ClickEventHandler);
m_pHtmlDoc2.onclick = ClickDHandler;

也就说,如果监视一个事件,就要new 一个 CHTMLEventHandler,OK,这个问题就告一段落了,终于可以继续做自己的项目了。希望今天写的对大家有所帮助。

源文:http://www.spbdev.com/Articles/ArticleRead.aspx?id=57

转载于:https://www.cnblogs.com/changyou/archive/2010/01/10/1643534.html

为WebBrowser的WEB页的Document注册事件的问题相关推荐

  1. ActiveX技术在WEB页上的应用[转载]

       ActiveX技术在WEB页上的应用 汪涛 Internet 的发展可以说是日新月异,这种快速的发展给人们带来了大量的机会.全世界的电信服务商都在寻找增强Internet在线服务的方法.在Int ...

  2. web页,如何按回车获得焦点,触发web控件事件..?

      困饶很久的一个问题,web页,按回车获得焦点,触发web控件事件..如何? 一个web页 <form   id= "form1 "   runat= "serv ...

  3. 利用WebBrowser实现Web打印的分析

    利用WebBrowser实现Web打印的分析 原文:利用WebBrowser实现Web打印的分析 WebBrowser是IE内置的浏览器控件,无需用户下载.本文档所讨论的是有关IE6.0版本的WebB ...

  4. 在Web页上模拟(QQ)魔法表情

    在WEB页面中利用层(DIV)和嵌入FLASH时对相关的属性进行设置,可以模拟出魔法表情的效果.(即播放透明背景的SWF,具体可以看看QQ较新版本中的"魔法表情"功能).由于是在W ...

  5. ThreeJS 炫酷特效旋转多面体Web页 Demo 01《ThreeJS 炫酷特效制作》

    本案例为一个 threejs 的特效网页,大小球体进行包裹,外球体为透明材质,但是进行了线框渲染,使其能够通过外球踢查看其内球体. 注:案例参考源于互联网,在此做代码解释,侵删 本案例除 ThreeJ ...

  6. Web页中使用MediaPlayer

    2019独角兽企业重金招聘Python工程师标准>>> 在Web页中嵌入Media Player的方法比较简单,只要用HTML中的<Object></Object& ...

  7. 转一下大牛的嵌入web页播放视频方法(转)

    来自:http://www.cnblogs.com/bandry/archive/2006/10/11/526229.html 在Web页中嵌入Media Player的方法比较简单,只要用HTML中 ...

  8. Web三大组件的注册——Servlet、Filter、Listener(监听三大作用域: ServletContext、HttpSession、ServletRequest )

    Web三大组件的注册 Servlet @WebServlet("/user.action") <servlet> </servlet> <servle ...

  9. web页在微信中访问增加遮罩层 右上角弹出在浏览器中打开

    web页在微信中访问增加遮罩层 右上角弹出在浏览器中打开 <style type="text/css"> * {margin: 0;padding: 0; }a {te ...

最新文章

  1. nginx配置文件基本配置
  2. 同步、异步;阻塞、非阻塞
  3. 创建表名作为参数的mysq存储过程【procedure】
  4. python 用turtle库画围棋棋盘和正、余弦函数图形
  5. nmon安装为什么重启mysql_Nmon的安装及使用
  6. C# Global.asax.cs 定时任务
  7. ios服务器需要开启ipv6的支持,针对iOS审核要求为应用兼容IPv6
  8. 机器学习 —— 浅谈贝叶斯和MCMC
  9. java jar包示例_Java包getImplementationVersion()方法和示例
  10. 作者:程学旗(1972-),男,中国科学院计算技术研究所研究员、博士生导师、副所长,中国科学院网络数据科学与技术重点实验室主任。...
  11. 【白话设计模式二十二】解释器模式(Interpreter)
  12. CodeBlocks调试功能(转)
  13. mysql 性能问题_mysql 性能问题
  14. 量化交易软件 python_我用Python做了个量化交易工具!
  15. fir低通滤波器c语言,大神教你:FIR与IIR低通滤波器的最简最快实现
  16. Unity InputField光标位置不对
  17. sql中的 between and 用法
  18. 足下校园C语言评估系统答案,江苏省江阴市南闸实验学校2020-2021学年八年级下学期第4周周练语文卷(word含答案))...
  19. 程序员写好技术文章的几点小技巧,简述java内存模型面试
  20. java while详解_Java while循环-Java while-嗨客网

热门文章

  1. [原]用三行代码实现对音量的控制,实现增大,减小,静音
  2. linux 字符下 上网,Linux下实现字符串截取方法总结(示例代码)
  3. Python机器学习:评价分类结果008ROC曲线
  4. linux找数组规矩,linux shell 数组建立及使用技巧(示例代码)
  5. 如何用matlab分析代谢,代谢流分析工具-CellNetAnalyzer
  6. 弹出数组第一个元素 php,弹出第一个元素数组以在php codeigniter中插入批处理
  7. java为什么用工厂模式_为什么用简单工厂模式,而不是直接实例化对象
  8. knn k的选取_经典算法(四):KNN
  9. 服务器性能发挥,浪潮服务器发挥性能优势,算力“焦虑”问题被解决
  10. 关于微信和支付宝小程序审核记录分享