原文:为WebBrowser的WEB页的Document注册事件的问题

当使用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

为WebBrowser的WEB页的Document注册事件的问题的更多相关文章

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

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

  2. 解决WEB页面上"焦点控制"一法

    解决WEB页面上"焦点控制"一法 分类: Html/Css2011-11-11 17:28 125人阅读 评论(0) 收藏 举报 webjavascriptasp.netbutto ...

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

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

  4. Omi实战-QQ附近用户列表Web页

    原文地址https://github.com/AlloyTeam/omi/blob/master/docs/cn_pr_nearby.md 写在前面 Omi很适合大型复杂的Web页面开发,例如一些We ...

  5. WinForm使用WebBrowser操作HTML页面的Element

    前言 在 Window Form 应用程序如果需要浏览网页时可以崁入 WebBrowser 控件,但如果需要操作崁入的 HTML 的网页元素,就需要额外的操作,以下纪录几种操作 HTML 元素的方法以 ...

  6. PyQt写的浏览单web页面的browser - 开源中国社区

    PyQt写的浏览单web页面的browser - 开源中国社区 PyQt写的浏览单web页面的browser

  7. 小型 Web 页项目打包优化方案

    背景   目前团队中新的 Web 项目基本都采用了 Vue 或 React ,加上 RN,这些都属于比较重量级的框架,然而对于小型 Web 页面,又显得过大.早期的一些项目则使用了较原始的 HTML ...

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

    https://blog.csdn.net/zgsdzczh/article/details/79744838 web页在微信中访问增加遮罩层 右上角弹出在浏览器中打开   <style typ ...

  9. C#-WebForm-WebForm开发基础、如何给控件注册事件?——事件委托写法、http无状态性、三层结构

    (小知识 - xml:可扩展的标记语言 html:超文本标记语言) 一.创建WebForm:新建→网站 此时文件夹中只有一个 config 文件,打开后 二.在项目下右键添加新项 在设计页面中打开 从 ...

随机推荐

  1. ICT工作的思考&lt;两&gt;

    2周奋战.我负责的LB昨天完成了最后一个模块.最后20日. 一周早于预期,经理说,出乎他的意料.So 奖励表,昨日,管理人员与我们合作,吃烧烤补补身子.我只想说,最后一个喘息. 这两周的生活确挺忙碌的 ...

  2. [Android 4.4.4] 泛泰A870 通过刷第三版 Mokee4.4.4 KTU84P 20140626 RC2.1 by syhost

    主题及注意事项请访问以前的版本: http://blog.csdn.net/syhost/article/details/29931291 此RC2.1版比RC2.0改进的地方: 1. Mokee本身 ...

  3. 使用 gridfs-stream 存储文件遇到的一个坑。

    前一段时间参读了某个coder写的用 gridfs-stream 来存储文件,感觉不错就自己用 gridfs-stream 模块写了一个文件存储服务,但是发现存储的文件总是删不掉, 我调用的是GFS的 ...

  4. c# 16进制显示转化

    非原创. 接收16进制数据,在TextBox委托显示: private void readPortandShow() { char[] HexChar = { '0', '1', '2', '3', ...

  5. 创建在SQLServer 和 Oracle的 DBLINK

    dblink 当我们要跨本地数据库.訪问另外一个数据库表中的数据时,本地数据库中就必需要创建远程数据库的dblink,通过dblink本地数据库能够像訪问本地数据库一样訪问远程数据库表中的数据. 一 ...

  6. SQL入门学习6-集合运算

    7-1 表的加减法 集合运算 集合运算就是对满足同一规则的记录,进行的加减等四则运算. 1.1 表的加法--UNION 表之间进行并集运算. 语法: SELECT 对应列1,对应列2-- FROM 表 ...

  7. ViewPager实现页面切换

    先贴效果图(每个开关Tab债券.尾随页变化.效果图蓝条添加的用户体验) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzIxMDYyMA==/fo ...

  8. 一个Bug的反思

    对输入数据判重,使用Map,将对象作为Key,使用map的containsKey方法来着重是否是重复记录.正常的处理流程:(1)将输入的数据封装成对象(2)判重,将没有重复的数据存储到map(3)对没 ...

  9. 每天收获一点点------Hadoop之HDFS基础入门

    一.HDFS出现的背景 随着社会的进步,需要处理数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是却不方便管理和维护—>因此,迫切需要一种系统来管理多 ...

  10. response的contentType 几种类型

    ajax开发中在请求server端的响应时, 对于每一种返回类型 规范的做法是要在服务端指定response的contentType 的. (当然 不指定绝大多数情况下也没什么问题 尤其是返回&quo ...