凤阳王良才酸菜鱼电话:在WebBrowser里如何响应HTML事件

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 13:36:34

悬赏100分:在WebBrowser里如何响应HTML事件?(99分后加) [问题点数:100分,结帖人:kitegirl

(小仙妹) 楼主发表于:2002-03-18 09:40:26 由于这个问题不一定有人回答出来,所以暂时是1分。如果有圆满答案肯定加分。

最近以VB制作程序,以WebBrowser做输出显示还可以(比如输出个报表),但是不能捕捉事件。比如我以WebBrowser打开一个web页,当我用鼠标指向一个IMG时候在网页里会产生一个onmouseover事件,但是这个事件如何让VB程序获得?不知道有什么办法能捕捉HTML元素的事件?
只要能实现如下目的,就算解决了!

1、在WebBrowser里打开一个有两个IMG的网页。
2、当鼠标移动到第一个IMG上的时候,VB程序的Text1显示“A”
3、当鼠标移动到第二个IMG上的时候,VB程序的Text1显示“B”
4、当鼠标点击第一个IMG上的时候,VB程序的Text2的数值加一
5、当鼠标点击第二个IMG上的时候,VB程序的Text2的数值减一

如果真的可以捕捉HTML事件,那将可以制作出极其美观的程序。同时可以省掉很多控件。

另外,是否可以把HTML元素直接放到Form窗体上呢?如果有办法也请给出一个例子。(想吃老虎的小猪) #1楼 得分:50回复于:2002-03-18 10:05:25 以前做过几个小例子放家里了,明天如果还没有朋友拿到那99分,我再来试试看。我记得有这么几个方面的东西需要了解,也算是线索吧。

你试过在VB里面引用接口么?解决了这个问题,剩下的步骤和vc来做没什么区别了。
首先,解决这个问题需要用到一点vb里面不常用的东西。你查一下   Implements   这个   statement   ,vb用它可以引入interface,还可以一定程度上模拟“继承”。

其次,需要查一下IE编程需要调用哪几个接口(不好意思,我不大记得,MSDN   Library上有的东西我都不记——piggybrain)。然后用   implements引入这几个interface,并实现必需的方法。

另外可能还需要用到CallByName这个方法,因为你需要在你的vb程序中创建一个   class,然后传递这个class的一个instance给IE的接口作为callback的方法的载体来响应DHTML中的事件,例如:onmousemove。

(想吃老虎的小猪) #2楼 得分:0回复于:2002-03-18 10:12:56 我记得好像需要引用   IWebBrowser2   这个接口(shdocvw.dll),如果要处理DHTML中的events,引用   DWebBrowserEvents2   这个接口。

对了,我查了一下   MSDN   Library,有这么两个标题对你可能有帮助:
Reusing   the   WebBrowser   Control
Reusing   MSHTML

新版本的MSDNLib真麻烦,基本都是.net   framework的东西,卸载,重装之...(陈锐) #3楼 得分:50回复于:2002-03-18 10:25:44 tips:程序中如何监控网页中元素的事件  

对编写脚本熟悉的读者都知道页面中可以添加脚本响应元素的事件,例如超链接的OnClick事件,图片的OnMouseMove事件,我们也可以使VB程序响应这些事件。下面是一个VB响应页面中按钮的Click事件的代码:  
首先建立一个新工程,在Form1中加入一个Webbrowser控件,然后在Form1中加入以下代码:  

Option   Explicit  

Public   Sub   Some_Procedure()  
MsgBox   "你点击了按钮. "  
End   Sub  

Private   Sub   Form_Load()  
'下载空页面  
WebBrowser1.Navigate2   "about:blank "  
End   Sub  

Private   Sub   WebBrowser1_DocumentComplete(ByVal   pDisp   As   Object,   URL   As   Variant)  
'建立事件响应类  
Dim   cfForward   As   clsForward  

'定义在浏览器中显示的HTML代码,其中包含一个按钮btnMyButton  
Dim   sHTML   As   String  
sHTML   =   "

This   is   some   text.

"  
sHTML   =   sHTML   &   "

And   here   is   a   button.

"  
sHTML   =   sHTML   &   " "  

'将HTML代码写入浏览器  
WebBrowser1.Document.body.innerHTML   =   sHTML  

'将事件响应类连接到页面的按钮btnMyButton上  
Set   cfForward   =   New   clsForward  
cfForward.Set_Destination   Me,   "Some_Procedure "  
WebBrowser1.Document.All( "btnMyButton ").onclick   =   cfForward  
End   Sub  

向工程中添加一个Class   Module,Class   Module的Name属性设定为clsForward,在clsForward中添加以下代码:  

Option   Explicit  

Dim   oObject   As   Object  
Dim   sMethod   As   String  
Dim   bInstantiated   As   Boolean  

Private   Sub   Class_Initialize()  
bInstantiated   =   False  
End   Sub  

Public   Sub   Set_Destination(oInObject   As   Object,   sInMethod   As   String)  
Set   oObject   =   oInObject  
sMethod   =   sInMethod  
bInstantiated   =   True  
End   Sub  

Public   Sub   My_Default_Method()  
If   bInstantiated   Then  
CallByName   oObject,   sMethod,   VbMethod  
End   If  
End   Sub  

运行程序,点击Webbrowser中的“Click   this   button”按钮。程序就会弹出消息框提示“你点击了按钮.”

(陈锐) #4楼 得分:0回复于:2002-03-18 10:28:04 上面的范例是监控一个有name属性的按钮,对于像图片这样的元素,你可以给它一个Name,或者遍历页面元素获得Img元素,下面是一个遍历页面元素的范例:

怎么用vb   script脚本读出网页中radio选的值?
代码:








   


   


   


   


   


   



                            加入收藏夹





基本上就是通过遍历访问页面中的元素来实现的(想吃老虎的小猪) #5楼 得分:0回复于:2002-03-18 11:05:36 tips:程序中如何监控网页中元素的事件  

这段代码很眼熟,从MSDN翻译的吧,呵呵

'将事件响应类连接到页面的按钮btnMyButton上  
Set   cfForward   =   New   clsForward  
cfForward.Set_Destination   Me,   "Some_Procedure "  
WebBrowser1.Document.All( "btnMyButton ").onclick   =   cfForward  

核心代码就这两句。
cfForward.Set_Destination   object,   Method_of_object   (好比传递函数指针,这样的使用方式有点像c#里面的delegate,或者java中传递一个object的instance,并invoke某个method)。完全可以绑定另外的object的method,clsForward内部用   CallByName   来调用比如Form1(传入Me)   这个对象(你自己的其他对象也可以)的   Some_Procedure(Some_Procedure不需要参数,你可以传递其它方法,甚至调用事件处理方法如From1_OnUnload,并传递需要的参数)。
WebBrowser1.Document.All( "btnMyButton ").onclick   =   cfForward  
绑定DHTML的event   object到clsForward的实例。

不过WebBrowser不具备InternetExplorer的部分功能。我前面说需要引用几个interface说错了,不好意思。你的要求不用引用接口,那些interface是用来控制InternetExplorer的instance的,比如监控浏览器下载的内容如果是flash,就忽略(现在很多广告flash的循环做得不好,非常消耗cpu资源,而且flash存在恶意攻击的可能)...(想吃老虎的小猪) #6楼 得分:0回复于:2002-03-18 11:27:09 另外请教     TechnoFantasy(www.applevb.com)  
我认为   CallByName   就“是”   VB   的   Delegate,只是需要像delegate那样通过interface来约束项目中几个模块(比如不同的人写的)之间用这样的方法进行一些高级的refactory工作。不过眼下有个问题不明白,

Public   Sub   My_Default_Method()  
If   bInstantiated   Then  
CallByName   oObject,   sMethod,   VbMethod  
End   If  
End   Sub  

将某个方法设置为该类的默认方法,除了在vb的类生成工具中设置,还能怎么做呢?
比如除了手工修改   cls文件中,在该方法中加入
Attribute   disConnect.VB_UserMemId   =   0,有没有办法在写cls的代码的时候将该方法标注为默认方法(属性也是如此)呢?
(葡萄) #7楼 得分:0回复于:2002-03-18 12:22:40 tools   -> procedure   attributes-> advanced
set   procedure   id=(default)(小仙妹) #8楼 得分:0回复于:2002-03-18 12:46:41 还是头一次听说有这种用法的,我会好好研究一下的。分数我已经预备好了!(看看上面是不是100分?)。晚上我回家做做看,如果没有任何疑问就加分了。