Chinaunix首页 | 论坛 | 博客
  • 博客访问: 621213
  • 博文数量: 233
  • 博客积分: 2221
  • 博客等级: 大尉
  • 技术积分: 3184
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-16 14:01
个人简介

瓜瓜派的瓜瓜

文章分类

全部博文(233)

文章存档

2013年(28)

2012年(197)

2011年(8)

分类: IT业界

2012-01-09 16:16:56

控制WebBrowser实际上就是控制IE,最简单的方法就是执行javascript或vbscript,省去了接口的转换。
如何执行脚本?以前我一直用mshtml中IHTMLWindow2接口的execScript()方法,在Delphi中需要uses MSHTML单元:
  • uses MSHTML;

  • procedure TForm1.Button1Click(Sender: TObject);

  • begin
  •   (WebBrowser1.Document as IHTMLDocument2).parentWindow.execScript(

  • 'alert("hello");', 'javascript')

  • end;

在CSharp中则需要在工程添加Micrsoft.mshtml,后来得到在地址栏执行脚本的启发。用WebBrowser的Navigate()方法更简单:
  • procedure TForm1.Button1Click(Sender: TObject);

  • begin
  •   WebBrowser1.Navigate('javascript:alert("hello");')

  • end;

省去了添加引用的麻烦。

如何调用外部的方法?先看一段在IE中添加收藏夹的代码:
  • window.external.AddFavorite(url, title);

脚本中window.external对象就是一个外部对象,AddFavorite()则是这个外部对象的方法!
查了一下资料,原来可以通过
IDocHostUIHandler接口的GetExternal()方法,指定脚本的外部对象。

在CSharp中更简单,有WebBrowser.ObjectForScripting属性直接对应window.external,参考如下代码:
  • [ComVisible(true)]

  • public partial class Form1 : Form
  • {

  • public Form1()
  •     {
  •         InitializeComponent();
  •     }

  • private
    void Form1_Load(object sender, EventArgs e)
  •     {
  •         webBrowser1.DocumentText = @"
  •             
  •                
  •             
  •             ";
  •     }

  • public
    void alertMessage(string s)
  •     {
  •         MessageBox.Show(s, "囧");
  •     }

  • private
    void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
  •     {
  •         webBrowser1.Navigate(@"javascript:
  •             function alert(str)
  •             {
  •                 window.external.alertMessage(str);
  •             }");
  •         webBrowser1.ObjectForScripting = this;
  •     }
  • }
阅读(1236) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~