原文:为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. 了解HTML5和“她”的 API (三)

    Web Workers(后台线程) JavaScript是单线程的,较长的javascript运算会阻塞UI线程. web worker 是运行在后台的 JavaScript,不会影响页面的性能. 在 ...

  2. IIS URL Rewrite Module防盗链规则配置方法

    IIS版本:IIS 7.5 URL Rewrite组件:IIS URL Rewrite Module(http://www.iis.net/downloads/microsoft/url-rewrit ...

  3. ef添加字段

    先在实体类里添加字段 ,然后执行 Add-Migration updateNumberOfLikes Update-Database -Verbose

  4. Project_2007关键

    本人今天成功用这个密钥,安装project2007. 分享给着急的小伙伴们. W2JJW-4KYDP-2YMKW-FX36H-QYVD8 版权声明:本文博客原创文章.博客,未经同意,不得转载.

  5. iOS6之后 NSAttributedString 福利

    @于iOS6之前,需要使用NSMutableAttributedString当你需要导入:CoreText.framework框架的.但在iOS6 之后就不在须要了. - (void)testOfNS ...

  6. 人迹罕至的android要完全退出程序的一种方法

    最近的一个项目,无意中发现了一个方法,使android要完全退出程序的一种方法,遥想当年,以便找到让的有效途径android遇险完全退出程序,我不由得有些感慨. 在这里,不敢独享.和大家分享一下,还启 ...

  7. JAVA必备——Struts

    在我们的开发中,有一个经典的框架,就是SSH,他们各自是:Struts,Spring,Hibernate,我们队他们神交已久,在曾经的博客中我介绍了Hibernate,今天我们也逐步揭开Struts的 ...

  8. urlrewrite使用地址重写

    地址重写: 主要是为了站点的安全. 比如我们平时的地址请求 地址重写前,訪问路径是: /read.egov?action=read&bid=2 地址重写后,訪问路径是:/read-read-2 ...

  9. 接收一个IT招聘促销信息,试着想参加,有兴趣的可以携手并进,共同。

    时隆重举行! 招聘的企业: (个人认为,中智.也买酒还是非常有吸引力的) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHdia2Zj/font/5a6L ...

  10. Android - 采用ApiDemos得知Android开展

    采用ApiDemos得知Android开展 本文地址: http://blog.csdn.net/caroline_wendy 位置: android-sdk/samples/android-20/l ...