在上个礼拜5的时候,再一次遇到了很奇怪的问题。当我建立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,这个问题就告一段落了,终于可以继续做自己的项目了。希望今天写的对大家有所帮助。

我们下期见。

[C#问题--WebBrowser继续追踪]WebBrowser在Form程序中使用的感想2相关推荐

  1. [C#问题]WebBrowser在Form程序中使用的感想。

    这个礼拜,一直在做一件事情,问题的来源就是在C#的Form程序中,实现显示GIF的功能.或许很多人都说这不简单,用Label或者PictureBox不就行了,呵呵,是的,但这不是需求的功能.我要实现的 ...

  2. 解决WebBrowser控件会导致应用程序占用内存居高不下问题

    WebBrowser 是一个 .NET 控件类,在 .NET Framework 2.0 版中新增.WebBrowser 类使用户可以在窗体中导航网页,下面我们来看在开发中碰到WebBrowser控件 ...

  3. C# .NET 6.0已经取消了Framework 4.8的WebBrowser控件,几款NuGet中的浏览器控件介绍

    即使在C# .NET 6.0..NET 7.0在选择工具箱项COM组件添加Microsoft Web Browser,工具箱也没有WebBrowser控件. WebBrowser控件: WebBrow ...

  4. java jeditorpane 自动换行_JDIC 中利用WebBrowser内置浏览器到java application中 | 学步园...

    JDIC简介: JDesktop Integration Components (JDIC),是一个开源的项目,目的是构建消除本机应用程序和 Java 等价物之间差距的组件.项目组长是个中国人.该项目 ...

  5. python webbrowser javascript_13.8. webbrowser — 显示网页

    目的: 使用 webbrowser 模块将网页呈现给用户. webbrowser 模块中包含了在交互式浏览器中用于打开 URL 的一系列函数.该模块包含了可用浏览器的注册列表,避免系统上有多个可选的浏 ...

  6. antd Form.Item 中如何获取到Select的label值

    存在这样的一个情况: 在这样的一个下拉的选择框中,如何获取到对应的 商品类型的值,和label的值 在select 中存在这样的一个属性: labelInValue 看看我们怎么使用: 代码: < ...

  7. 润乾报表JSF FORM 标签中使用填报表解决方案

     需求 润乾报表的标签需要在jsf页面中和其他填报控件一起使用,润乾报表负责展现录入部分数据,并且这部分数据和页面的其它控件的数据存在前台和后台的交互. 问题 润乾报表在前台会生成自己的form, ...

  8. 数据从程序中传入到form中

    SMARTFORMS和SAPSCRIPT FORM都是 SAP中设计打印报表的工具,但是SAPScript需要手工一条一条的根据坐标和长.高画表格线,这样极为不方便,而SmartForms有一个GUI ...

  9. 解析ajax数据显示到from表单中,jQuery Ajax从另一页上的Form请求中提取数据?

    我想用jQuery和ajax抓取页面的一些元素......没问题.但是,直到用户单击表单中的按钮时才会显示这些元素,因此除非执行该操作,否则实际上我无法从页面中取出任何内容.任何人都知道这可以实现吗? ...

最新文章

  1. Node2Vec:万物皆可Embedding
  2. 【IBM研究院】2020年人工智能发展五大预测
  3. 面试必问!Tomcat 优化篇!
  4. 给一维数组输入6个整数,假设为5,7,4,8,9,1
  5. 最受欢迎的java技术_最受欢迎的Java环境
  6. python命令行运行模式_[Python] 命令行模式阅读博客园的博文
  7. java word在线预览_java 生成word文档并且在线预览的问题
  8. 云原生架构及设计原则
  9. python getopt_python 5种 statsPython中的getopt函数使用详解
  10. mysql注入如何读取本地文件_如何通过SQL注入获取服务器本地文件
  11. 基于nonebot的QQ群聊机器人制作(一)
  12. PHPWAMP强行脱离依赖,在系统缺失必备组件或DLL受损的情况下依然能正常运行
  13. 计算机二级可以用笔记本电脑学吗,计算机二级可以自学好过吗
  14. 几何图形变化(Codevember)
  15. findContours函数报错:“将一个无效参数传递给了将无效参数视为严重错误的函数”解决方案之一
  16. 非线性转化为线性规划的方法
  17. Win10添加、删除鼠标右击的选项(快捷方法)
  18. 计算机函数公式的使用VLOOKUP,EXCEL函数公式大全使用VLOOKUP函数IF函数数据验证来自动获取价格...
  19. bzoj 4808: 马【匈牙利算法】
  20. 【STC89C52】点阵屏显示爱心

热门文章

  1. 十只小猪称体重(判断第几只为最重)
  2. 查找论文的方法(ICCV,CVPR,ECCV)
  3. QT 笔记3 | Qt设计师使用 Qt创造器使用
  4. 计算机无法代替的工作有哪些,人工智能代替不了哪些行业?一起来看看!
  5. 乐固、360加固在android 11 及以上和鸿蒙系统上报错,无法安装
  6. 沉浸式iOS热更新方案
  7. 1.2 Probability Theory (下)
  8. JavaScript脚本延迟加载的方式有哪些?(笔记)
  9. Sublime Text Mac完美版
  10. linux 前端开发软件下载,linux前端开发工具下载_系统之家