为WebBrowser的WEB页的Document注册事件的问题
原文:为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注册事件的问题的更多相关文章
- 转一下大牛的嵌入web页播放视频方法(转)
来自:http://www.cnblogs.com/bandry/archive/2006/10/11/526229.html 在Web页中嵌入Media Player的方法比较简单,只要用HTML中 ...
- 解决WEB页面上"焦点控制"一法
解决WEB页面上"焦点控制"一法 分类: Html/Css2011-11-11 17:28 125人阅读 评论(0) 收藏 举报 webjavascriptasp.netbutto ...
- 利用WebBrowser实现Web打印的分析
原文:利用WebBrowser实现Web打印的分析 WebBrowser是IE内置的浏览器控件,无需用户下载.本文档所讨论的是有关IE6.0版本的WebBrowser控件技术内容.其他版本的IE应该也 ...
- Omi实战-QQ附近用户列表Web页
原文地址https://github.com/AlloyTeam/omi/blob/master/docs/cn_pr_nearby.md 写在前面 Omi很适合大型复杂的Web页面开发,例如一些We ...
- WinForm使用WebBrowser操作HTML页面的Element
前言 在 Window Form 应用程序如果需要浏览网页时可以崁入 WebBrowser 控件,但如果需要操作崁入的 HTML 的网页元素,就需要额外的操作,以下纪录几种操作 HTML 元素的方法以 ...
- PyQt写的浏览单web页面的browser - 开源中国社区
PyQt写的浏览单web页面的browser - 开源中国社区 PyQt写的浏览单web页面的browser
- 小型 Web 页项目打包优化方案
背景 目前团队中新的 Web 项目基本都采用了 Vue 或 React ,加上 RN,这些都属于比较重量级的框架,然而对于小型 Web 页面,又显得过大.早期的一些项目则使用了较原始的 HTML ...
- web页在微信中访问增加遮罩层 右上角弹出在浏览器中打开
https://blog.csdn.net/zgsdzczh/article/details/79744838 web页在微信中访问增加遮罩层 右上角弹出在浏览器中打开 <style typ ...
- C#-WebForm-WebForm开发基础、如何给控件注册事件?——事件委托写法、http无状态性、三层结构
(小知识 - xml:可扩展的标记语言 html:超文本标记语言) 一.创建WebForm:新建→网站 此时文件夹中只有一个 config 文件,打开后 二.在项目下右键添加新项 在设计页面中打开 从 ...
随机推荐
- 解决:对 PInvoke 函数的调用导致堆栈不对称问题
解决:对 PInvoke 函数的调用导致堆栈不对称问题 问题描述: 在使用托管代码调用非托管代码时,发生“对 PInvoke 函数“UseTwiHikVisionDllTest!UseTwiHikVi ...
- Javascript作用域问题的构造函数的变量
构造函数new对于使用.代表创建对象.此外,它可以被用作普通的函数调用,因为它也是一个功能. function Person(name) { this.name=name; } Person(12); ...
- 解决IIS7中出现An error occurred on the server when processing the URL错误提示的方法
在IIS7上配置一个asp程序,出现了一个错如提示: An error occurred on the server when processing the URL. Please contact t ...
- hdu 2243 考研绝望——复杂的文字(AC自己主动机+矩阵高速功率)
pid=2243" target="_blank" style="">题目链接:hdu 2243 考研路茫茫--单词情结 题目大意:略. 解题思 ...
- Nancy 框架
Nancy 框架 Nancy 框架 1.是一个轻量级用于构建http相应的web框架: 2.与mvc类似,有自己的路由机制: 3.可以处理 DELETE , GET , HEAD , OPTIO ...
- 无法使用SQL login去登陆SQL Server - 'Password did not match'
原文:无法使用SQL login去登陆SQL Server - 'Password did not match' 出自:http://blogs.msdn.com/b/apgcdsd/archive/ ...
- 用python做oj上的简单题(持续更新中.......)
本人刚開始接触python,在oj上解一些简单的题,欢迎交流,不喜勿喷. OJ地址链接:acm.sdut.edu.cn http://acm.sdut.edu.cn/sdutoj/showproble ...
- 设计模式之空对象(Null Object)模式
通过引用Null Object,用于取消业务逻辑中对对象的为空推断 类图: Nullable: package com.demo.user; public interface Nullable { b ...
- NSIS文字及字符串函数与头文件介绍
原文 NSIS文字及字符串函数与头文件介绍 文字函数,顾名思义就是处理字符串的函数.使用这些字符串函数前,必须先包含头文件WordFunc.nsh.该头文件目前包含如下一些函数:WordFind.Wo ...
- WP8加入自己定义铃声
1.下载千千静听绿色版,下载地址:http://pan.baidu.com/s/1ntuSNOH 2.将目标铃声加入到千千静听,选中铃声,右键选文件属性. 3.改动文件属性,将流派改为"Ri ...