WebBrowser用法总结

 
简单用了一下记录一下:
private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show(webBrowser1.Document.Body.InnerHtml);
//得到浏览器html内容,还可以用GetElementById();
}

private void Form2_Load(object sender, EventArgs e)
{
    webBrowser1.Navigate(
"http://www.it100.info");
}
url:http://greatverve.cnblogs.com/archive/2011/07/07/WebBrowser.html
教你在C#中WebBrowser的使用
  其实网络上这类文章很多,我大致从头说说我自己的经验。
1、加入引用
在控件栏按右键,选择“添加/移除项”,选COM组件,选中“Microsoft Web Browser”。然后就可以往窗体上拖出一个该控件(下面把该控件一个对象称为webBrowser)。控件属性中可以调整的不多,从一些资料中得知WebBrowser中的MenuBar、StatusBar等其实都没实现。

2、控件的函数
由于是COM过来的控件,它的一些函数就比较怪,基本的Navigate函数除了第一个参数外,其它都是ref类型的,需要显式地写ref才能调用。一般要使之导向到某个页面,先设置一个空对象,object objNull=null;然后
webBrowser.Navigate(strPage, ref objNull, ref objNull, ref objNull, ref objNull);
即可。具体其它四个参数可参考相关文档。
还有一个常用的功能,就是怎么让浏览器显示自己的html文档,一个方法是用DOM里根元素的innerText:
((mshtml.HTMLDocumentClass)webBrowser.Document).documentElement.innerText=sHTML;
相当用于Javascript设置网页的代码。这种方法方便是方便,但是有很多问题,写入的大部分Javascript函数都没法正常使用,即使用<script defer>似乎也没用;这样不能用前进、后退来进行历史浏览;查看源代码根本看不到什么……其实最致命的就是 Javascript没法用,无法满足一般的需要。
第二个方法是把自己的网页写到一个临时文件,然后navigate到这个文件,Foxmail是这样做的。这样做的缺点是会产生很多临时文件,文件在磁盘上的读写需要耗费较多时间,而且要记得及时清理。
第三个方法是用COM中IPersistStreamInit之类的,使用流操作,据说Outlook便是这样做的。这样显然是最好的,在内存中形成网页进行操作速度也很快。但我在.Net里找不到这个接口,所以不知道如何实现。

3、与应用程序交互
网页与应用程序的交互不外乎是网页上点击某链接,或通过其它途径,比如表单提交等,使浏览器导航至新的链接,所以我通过BeforeNavigate2这个事件来,该事件有flags、headers、postData、targetFrameName、uRL等属性,足够我们进行处理。这样我们程序就好像一个WebServer,可以处理网页上的链接、提交的表单等等。然后把使浏览器导航至处理后产生的结果网页。
又在网上看到有人用System.Runtime.InteropServices.Expando.IExpando:
mshtml.HTMLDocumentClass doc2=(mshtml.HTMLDocumentClass)webBrowser.Document;
System.Runtime.InteropServices.Expando.IExpando ex=(System.Runtime.InteropServices.Expando.IExpando)doc2;
System.Reflection.PropertyInfo piform1=ex.AddProperty("Form1");
piform1.SetValue(doc2,this,null);
这样,在网页中的document.Form1就是这个WinForm的Control了。你可以用脚本来调用Form1!这也不失为一个极妙的方法。

4、应用程序操作浏览器/网页:
WebBrowser浏览器控件提供了一些函数,如ExecWB,可以使浏览器执行内部定义的一些操作,如执行另存为:
webBrowser.ExecWB( SHDocVw.OLECMDID.OLECMDID_SAVEAS, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref objNull, ref objNull );
但似乎这里按取消的话会抛出一个异常,所以我用一个空的try{}catch(Exception){}来捕获它,就不会有错误了。
还可以用DOM里的一些方法来操作网页,举个例子,可以这样调用网页中写好的一个Javascript函数func():
((mshtml.HTMLDocumentClass)webBrowser.Document.DomDocument).parentWindow.execScript( "func()", "JScript" );
webBrowser1.Document.InvokeScript("__doPostBack", new object[] { "PageBar","2" });
暂时就这样,比较常用的也就是这些了。其它的就让我们在继续使用中慢慢琢磨体会吧。

WebBrowser 控件

   WebBrowser 控件可以在应用程序中承载网页以及支持浏览器的其他文档。例如,可以使用 WebBrowser 控件在应用程序中提供基于 HTML 的集成用户帮助或 Web 浏览功能。

     WebBrowser控件可以让你的用户浏览一个特定的网页。但它不是一个完整的浏览器,因为它没有地址栏,收藏夹 ,选项卡等等。你可以把它当做HTML中的iframe,但它提供了更丰富的界面。你可以通过两个手指收缩(和双击)来进行缩放,平移和滚动是自动内置的,你无须自己实现。

  这个控件另一个很棒的特性是它可以加载本地和网络中的内容。这意味着如果我有很多HTML文件(也许是文档),那么我不需要为我的应用程序去重新创建这些内容。相反,我可以将这些HTML页面嵌入到我的应用程序中,并在本地(电话中)加载他们而不是依靠一个可能会出现问题的数据连接。

WebBrowser 控件可提供下列功能:

导航SourceNavigateNavigateToStreamNavigateToString 和 Refresh

导航生存期NavigatingNavigated 和 LoadCompleted

导航日记CanGoBackGoBackCanGoForward 和 GoForward

WPF/HTML 互操作InvokeScriptObjectForScripting 和 Document

1)打开网络上指定的URL页面

private void button4_Click(object sender, RoutedEventArgs e)
        {
             webBrowser1.Navigate(new Uri("http://www.it100.info", UriKind.Absolute));//UriKind=UriKind.Absolute

        }

WebBrowser 控件用法详解

下面的代码假设你已经建立了一个Windows Form,上面有一个WebBrowser名为“webBrowser”。

Study Case 1:用WinForm的Event Handler响应Web页面的事件

现在有这样一个Windows Application,它的界面上只有一个WebBrowser,显示一个本地的HTML文件作为界面。现在的问题是,所有逻辑都可以放在

HTML文件里,唯独“关闭”按钮遇到了困难——通常,Web页面是没有办法直接控制浏览器的,更不用说结束这个WinForm程序了。

但是,在.Net 2.0当中,“由Windows Form响应Web页面的事件”已经成为了现实。

在.Net 2.0中,整个HTML文档以及其包含的各个HTML元素,都和一个个HtmlDocument、HtmlElement之类的.Net对象对应。因此只要找到这个“关闭”

按钮对应的HtmlElement对象,为其click事件添加Event Handler即可。

假设HTML源代码如下:

<html> 
<body> 
<input type="button" id="btnClose" value="关闭" /> 
</body> 
</html> 
那么找出该按钮并为之添加Event Handler的代码如下:

HtmlDocument htmlDoc = webBrowser.Document; 
HtmlElement btnElement = htmlDoc.All["btnClose"]; 
if (btnElement != null) 

     btnElement.click += new HtmlElementEventHandler(HtmlBtnClose_Click); 
}

其中HtmlBtnClose_Click是按下Web按钮时的Event Handler。

很简单吧?那么稍稍高级一点的——我们都知道一个HTML元素可能有很多各种各样的事件,而HtmlElement这个类只给出最常用、共通的几个。那么,

如何响应其他事件呢?这也很简单,只需要调用HtmlElement的AttachEventHandler就可以了:

btnElement.AttachEventHandler("onclick", new EventHandler(HtmlBtnClose_Click)); 
//这一句等价于上面的btnElement.click += new HtmlElementEventHandler(HtmlBtnClose_Click); 
对于其他事件,把"onclick"换成该事件的名字就可以了。例如:

formElement.AttachEventHandler("onsubmit", new EventHandler(HtmlForm_Submit));

Study Case 2:表单(form)的自动填写和提交

要使我们的WebBrowser具有自动填表、甚至自动提交的功能,并不困难。

假设有一个最简单的登录页面,输入用户名密码,点“登录”按钮即可登录。已知用户名输入框的id(或Name,下同)是username,密码输入框的id

是password,“登录”按钮的id是submitbutton,那么我们只需要在webBrowser的DocumentCompleted事件中使用下面的代码即可:

HtmlElement btnSubmit = webBrowser.Document.All["submitbutton"]; 
HtmlElement tbUserid = webBrowser.Document.All["username"]; 
HtmlElement tbPasswd = webBrowser.Document.All["password"];

if (tbUserid == null || tbPasswd == null || btnSubmit == null) 
    return;

tbUserid.SetAttribute("value", "smalldust"); 
tbPasswd.SetAttribute("value", "12345678");

btnSubmit.InvokeMember("click"); 
这里我们用SetAttribute来设置文本框的“value”属性,用InvokeMember来调用了按钮的“click”方法。因为不同的Html元素,其拥有的属性和方

法也不尽相同,所以.Net 2.0提供了统一的HtmlElement来概括各种Html元素的同时,提供了这两个方法以调用元素特有的功能。关于各种Html元素的

属性和方法一览,可以查阅MSDN的DHTML Reference。

※关于表单的提交,的确还有另一种方法就是获取form元素而不是button,并用form元素的submit方法:

HtmlElement formLogin = webBrowser.Document.Forms["loginForm"]; 
//…… 
formLogin.InvokeMember("submit"); 
本文之所以没有推荐这种方法,是因为现在的网页,很多都在submit按钮上添加onclick事件,以对提交的内容做最基本的验证。如果直接使用form的

submit方法,这些验证代码就得不到执行,有可能会引起错误。


Study Case 3:查找并选择文本

这次我们希望实现一个和IE一模一样的查找功能,以对Web页面内的文字进行查找。

文本查找要借助于TextRange对象的findText方法。但是,.Net里并没有这个对象。这是因为,.Net 2.0提供的HtmlDocument,HtmlWindow,

HtmlElement等类,只不过是对原有mshtml这个COM组件的不完整封装,只提供了mshtml的部分功能。所以许多时候,我们仍旧要借助mshtml来实现我

们需要的功能。好在这些.Net类都提供了DomDocument这个属性,使得我们很容易把.Net对象转换为COM对象使用。下面的代码演示了如何查找Web页面

的文本。 
(需要添加mshtml的引用,并加上using mshtml;)


    public partial class SearchDemo : Form
     {
        // 建立一个查找用的TextRange(IHTMLTxtRange接口) 
        private IHTMLTxtRange searchRange = null;
        public SearchDemo()
         {
             InitializeComponent();
         }

        private void btnSearch_Click(object sender, EventArgs e)
         {
            // Document的DomDocument属性,就是该对象内部的COM对象。 
             IHTMLDocument2 document = (IHTMLDocument2)webBrowser.Document.DomDocument;
            string keyword = txtKeyword.Text.Trim();
            if (keyword == "")
                return;

            // IE的查找逻辑就是,如果有选区,就从当前选区开头+1字符处开始查找;没有的话就从页面最初开始查找。 
            // 这个逻辑其实是有点不大恰当的,我们这里不用管,和IE一致即可。 
            if (document.selection.type.ToLower() != "none")
             {
                 searchRange = (IHTMLTxtRange)document.selection.createRange();
                 searchRange.collapse(true);
                 searchRange.moveStart("character", 1);
             }
            else
             {
                 IHTMLBodyElement body = (IHTMLBodyElement)document.body;
                 searchRange = (IHTMLTxtRange)body.createTextRange();
             }

            // 如果找到了,就选取(高亮显示)该关键字;否则弹出消息。 
            if (searchRange.findText(keyword, 1, 0))
             {
                 searchRange.select();
             }
            else
             {
                 MessageBox.Show("已搜索到文档结尾。");
             }
         }
     } 
到此为止,简单的查找就搞定了。至于替换功能,看了下一个例子,我相信你就可以触类旁通轻松搞定了。 
=============================
Study Case 4:高亮显示

上一个例子中我们学会了查找文本——究跟到底,对Web页面还是只读不写。那么,如果说要把所有的搜索结果高亮显示呢?我们很快会想到把所有匹

配的文字颜色、背景改一下就可以了。 
首先想到的可能是直接修改HTML文本吧……但是,与SourceCode的高亮显示不同,我们需要并且只需要高亮页面中的文本部分。HTML标签、脚本代码

等等是绝对不应该去改动的。因此我们不能把整个页面的Source Code读进来然后replace,那样有破坏HTML文件结构的可能;我们只能在能够分离出

文本与其他内容(标签,脚本……)的前提下进行。

具体方法有很多,下面提供两个比较简单的方法。

方法一:使用TextRange(IHTMLTxtRange) 
有了上一个Case的基础,相信大家立刻会想到使用TextRange。没错,TextRange除了提供查找方法之外,还提供了一个pasteHTML方法,以指定的HTML

文本替换当前TextRange中的内容。代码片断如下:

    public partial class HilightDemo : Form 
     { 
        // 定义高亮显示效果的标签。 
        string tagBefore = "<span style='background-color:yellow;color:black'>"; 
        string tagAfter = "</span>";

        // ……

        private void btnHilight_Click(object sender, EventArgs e) 
         { 
             HtmlDocument htmlDoc = webBrowser.Document; 
            string keyword = txtKeyword.Text.Trim(); 
            if (keyword == "") 
                return;

            object oTextRange = htmlDoc.Body.InvokeMember("createTextRange");

             mshtml.IHTMLTxtRange txtrange = oTextRange as mshtml.IHTMLTxtRange;

            while (txtrange.findText(keyword, 1, 4)) 
             { 
                try 
                 { 
                     txtrange.pasteHTML(tagBefore + keyword + tagAfter); 
                 } 
                catch { } 
                 txtrange.collapse(false); 
             } 
         } 
     }

※这段代码里获取IHTMLTxtRange的方式和上面的例子稍稍不同,其实所谓条条大路通罗马,本质是一样的。

方法二:使用DOM(文档对象模型) 
将HTML文档解析为DOM,然后遍历每个节点,在其中搜索关键字并进行相应替换处理即可。

    public partial class HilightDemo : Form 
     { 
        //……

        private void btnHilight_Click(object sender, EventArgs e) 
         { 
             HTMLDocument document = (HTMLDocument)webBrowser.Document.DomDocument; 
             IHTMLDOMNode bodyNode = (IHTMLDOMNode)webBrowser.Document.Body.DomElement; 
            string keyword = txtKeyword.Text.Trim(); 
            if (keyword == "") 
                return;

             HilightText(document, bodyNode, keyword); 
         }

        private void HilightText(HTMLDocument document, IHTMLDOMNode node, string keyword) 
         { 
            // nodeType = 3:text节点 
            if (node.nodeType == 3) 
             { 
                string nodeText = node.nodeValue.ToString(); 
                // 如果找到了关键字 
                if (nodeText.Contains(keyword)) 
                 { 
                     IHTMLDOMNode parentNode = node.parentNode; 
                    // 将关键字作为分隔符,将文本分离,并逐个添加到原text节点的父节点 
                    string[] result = nodeText.Split(new string[] { keyword }, StringSplitOptions.None); 
                    for (int i = 0; i < result.Length - 1; i++) 
                     { 
                        if (result[i] != "") 
                         { 
                             IHTMLDOMNode txtNode = document.createTextNode(result[i]); 
                             parentNode.insertBefore(txtNode, node); 
                         } 
                         IHTMLDOMNode orgNode = document.createTextNode(keyword); 
                         IHTMLDOMNode hilightedNode = (IHTMLDOMNode)document.createElement("SPAN"); 
                         IHTMLStyle style = ((IHTMLElement)hilightedNode).style; 
                         style.color = "black"; 
                         style.backgroundColor = "yellow"; 
                         hilightedNode.appendChild(orgNode);

                         parentNode.insertBefore(hilightedNode, node); 
                     } 
                    if (result[result.Length - 1] != "") 
                     { 
                             IHTMLDOMNode postNode = document.createTextNode(result[result.Length - 1]); 
                             parentNode.insertBefore(postNode, node); 
                     } 
                     parentNode.removeChild(node); 
                 } // End of nodeText.Contains(keyword) 
             } 
            else 
             { 
                // 如果不是text节点,则递归搜索其子节点 
                 IHTMLDOMChildrenCollection childNodes = node.childNodes as IHTMLDOMChildrenCollection; 
                foreach (IHTMLDOMNode n in childNodes) 
                 { 
                     HilightText(document, n, keyword); 
                 } 
             } 
         } 
     }

上面的两段代码都是为了清晰易懂而精简得不能再简的,有很多地方很不完善。比如,没考虑到如何从高亮显示状态复原;也没有大小写匹配等等。

当然,掌握了原理之后相信这些都不会太难。

这两种方法各有优缺点: 
使用TextRange较轻量迅速,而且有一个特长,就是可以把跨标签(Tag)的关键字挑出来。例如,有这么一段HTML:

<b>Hel</b>lo World!
先不管作者出于什么目的让Hel三个字母成为粗体,总之显示在页面上的是一句“Hello World!”。在我们希望高亮页面中的“Hello”这个关键字时

,如果用DOM分析的话,会得出含有“Hel”的<b>节点和文本节点“lo World!”两个节点,因此无法将其挑出来。而TextRange则能正确识别,将其设

置为高亮。因此也可以说TextRange是只和文本有关,和HTML语法结构无关的对象。

但是,TextRange也有其致命缺点,加亮容易,反向的话就很难。换句话说,去除高亮显示的时候不能再用TextRange,而需要采用其他方法。

而DOM方法则正好相反, 由于DOM的树状结构特性,虽然不能(或者很难)跨越Tag搜索关键字,但是去除高亮显示并不繁琐。

Study Case 5:与脚本的互操作

在Case 1当中,我们已经看到,Web页面的HTML元素的事件,可以由Windows Form端来响应,可以在某种程度上看作是Web页面调用WinForm;那么反过

来,WinForm除了可以直接访问Web页面的HTML元素之外,能否调用Web页面里的各种Script呢?

首先是调用Web页面的脚本中已经定义好的函数。假设HTML中有如下Javascript:

function DoAdd(a, b) {
    return a + b;
}
那么,我们要在WinForm调用它,只需如下代码即可:

object oSum = webBrowser.Document.InvokeScript("DoAdd", new object[] { 1, 2 });
int sum = Convert.ToInt32(oSum);
其次,如果我们想执行一段Web页面中原本没有的脚本,该怎么做呢?这次.Net的类没有提供,看来还要依靠COM了。IHTMLWindow2可以将任意的字符

串作为脚本代码来执行。

string scriptline01 = @"function ShowPageInfo() {";
string scriptline02 = @"      var numLinks = document.links.length; ";
string scriptline03 = @"      var numForms = document.forms.length; ";
string scriptline04 = @"      var numImages = document.images.length; ";
string scriptline05 = @"      var numScripts = document.scripts.length; ";
string scriptline06 = @"      alert('网页的统计结果:\r\n链接数:' + numLinks + ";
string scriptline07 = @"         '\r\n表单数:' + numForms + ";
string scriptline08 = @"         '\r\n图像数:' + numImages + ";
string scriptline09 = @"         '\r\n脚本数:' + numScripts);}";
string scriptline10 = @"ShowPageInfo();";

string strScript = scriptline01 + scriptline02 + scriptline03 + scriptline04 + scriptline05 +
                    scriptline06 + scriptline07 + scriptline08 + scriptline09 + scriptline10;

IHTMLWindow2 win = (IHTMLWindow2)webBrowser.Document.Window.DomWindow;
win.execScript(strScript, "Javascript");http://www.xmlasp.net/n1670c13.aspx


http://hi.baidu.com/motiansen/blog/item/9e99a518233ca3b24aedbca9.html
==================
使用ObjectForScripting属性,可启用 WebBrowser 控制项所装载之 Web 网页与包含 WebBrowser 控制项之应用程式间的通讯。
这个属性可让您整合动态超文字标记语言 (DHTML) 程式码与用户端应用程式程式码。
指定给这个属性的物件可让 Web 网页指令码做为 window.external 物件,这个物件是为了存取主应用程式而提供的内建 DOM 物件。


private void btnScriptEvent_Click(object sender, EventArgs e)
{
           webBrowser1.ObjectForScripting = this;

            string szWebBrowserText = "<html>" +
                "<head>" +
                "<title></title>"+                    
                 "</head>" +
               "<body onkeydown=\"KeyDown()\" oncontextmenu=\"event.returnValue=false\">"+
               
               "Please enter your name:<br/>"+
                 "<input type='text' name='Name'/><br/>"+
                 "<font onClick='window.external.ClickEvent(Name.value)'>Click Here</font>"+
                "</body></html>";


             webBrowser1.DocumentText = szWebBrowserText;
         }
        public void ClickEvent(string userName)
        {
            // Simply echo out the name that the user typed in the input box of the HTML page
            if (System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft == true)
                 MessageBox.Show("Hello " + userName, "Managed Web Browser Sample", MessageBoxButtons.OK,

MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading);
            else
                 MessageBox.Show("Hello " + userName, "Managed Web Browser Sample", MessageBoxButtons.OK,

MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);

         }

= szWebBrowserText;

==================================
异常类型 条件 
ArgumentException
设置该属性时指定的值为非公共类型的实例。

- 或 -

设置该属性时指定的值为非 COM 可见的类型的实例。有关更多信息,请参见 Marshal.IsTypeVisibleFromCom。

备注 
使用该属性启用 WebBrowser 控件承载的网页与包含 WebBrowser 控件的应用程序之间的通信。使用该属性可以将动态 HTML (DHTML) 代码与客户端

应用程序代码集成在一起。为该属性指定的对象可作为 window.external 对象(用于主机访问的内置 DOM 对象)用于网页脚本。

可以将此属性设置为希望其公共属性和方法可用于脚本代码的任何 COM 可见的对象。可以通过使用 ComVisibleAttribute 对类进行标记使其成为

COM 可见的类。

若要从客户端应用程序代码调用网页中定义的函数,请使用可从 Document 属性检索的 HtmlDocument 对象的 HtmlDocument.InvokeScript 方法。

示例 
下面的代码示例演示如何使用 ObjectForScripting 属性。在该示例中,ObjectForScripting 属性被设置为当前窗体。

---------

using System;
using System.Windows.Forms;
using System.Security.Permissions;

[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class Form1 : Form
{
    private WebBrowser webBrowser1 = new WebBrowser();
    private Button button1 = new Button();

    [STAThread]
    public static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new Form1());
    }

    public Form1()
    {
        button1.Text = "call script code from client code";
        button1.Dock = DockStyle.Top;
        button1.Click += new EventHandler(button1_Click);
        webBrowser1.Dock = DockStyle.Fill;
        Controls.Add(webBrowser1);
        Controls.Add(button1);
        Load += new EventHandler(Form1_Load);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        webBrowser1.AllowWebBrowserDrop = false;
        webBrowser1.IsWebBrowserContextMenuEnabled = false;
        webBrowser1.WebBrowserShortcutsEnabled = false;
        webBrowser1.ObjectForScripting = this;
        // Uncomment the following line when you are finished debugging.
        //webBrowser1.ScriptErrorsSuppressed = true;

        webBrowser1.DocumentText =
            "<html><head><script>" +
            "function test(message) { alert(message); }" +
            "</script></head><body><button " +
            "onclick=\"window.external.Test('called from script code')\">" +
            "call client code from script code</button>" +
            "</body></html>";
    }

    public void Test(String message)
    {
        MessageBox.Show(message, "client code");
    }

    private void button1_Click(object sender, EventArgs e)
    {
        webBrowser1.Document.InvokeScript("test",
            new String[] { "called from client code" });
    }

}


---------------------------------------------
// Navigates to the URL in the address box when 
// the ENTER key is pressed while the ToolStripTextBox has focus.
private void toolStripTextBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        Navigate(toolStripTextBox1.Text);
    }
}

// Navigates to the URL in the address box when 
// the Go button is clicked.
private void goButton_Click(object sender, EventArgs e)
{
    Navigate(toolStripTextBox1.Text);
}

// Navigates to the given URL if it is valid.
private void Navigate(String address)
{
    if (String.IsNullOrEmpty(address)) return;
    if (address.Equals("about:blank")) return;
    if (!address.StartsWith("http://") &&
        !address.StartsWith("https://"))
    {
        address = "http://" + address;
    }
    try
    {
        webBrowser1.Navigate(new Uri(address));
    }
    catch (System.UriFormatException)
    {
        return;
    }
}

// Updates the URL in TextBoxAddress upon navigation.
private void webBrowser1_Navigated(object sender,
    WebBrowserNavigatedEventArgs e)
{
    toolStripTextBox1.Text = webBrowser1.Url.ToString();
}

====================================================================================
HtmlElement.DomElement 属性
属性值
元素的 COM IUnknown 指针,可以将其强制转换为 HTML 元素接口中的某一个接口,如 IHTMLElement。 
备注 
HtmlElement 为 Internet Explorer 文档对象模型 (DOM) 的包装,它是用组件对象模型 (COM) 编写而成。如果需要访问基础 COM 接口中的未公开

属性或方法(如 IHTMLElement),可以使用此对象查询它们。

为了使用非托管接口,需要将 MSHTML 库 (mshtml.dll) 导入到应用程序中。但是,也可以使用 Invoke 方法执行未公开属性和方法。

示例 
下面的代码示例使用非托管接口获取当前选定的文本,并使用由用户选择的 URL 将其转换为超链接。编写此代码时,假定窗体拥有一个名为

WebBrowser1 的 WebBrowser 控件,并假定已经以引用的形式将非托管 MSHTML 库添加到项目中。

C# 复制代码
private void CreateHyperlinkFromSelection()
{
    if (webBrowser1.Document != null)
    {

        mshtml.IHTMLDocument2 iDoc = (mshtml.IHTMLDocument2)webBrowser1.Document.DomDocument;

        if (iDoc != null) 
        {
            mshtml.IHTMLSelectionObject iSelect = iDoc.selection;
            if (iSelect == null)
            {
                MessageBox.Show("Please select some text before using this command.");
                return;
            }

            mshtml.IHTMLTxtRange txtRange = (mshtml.IHTMLTxtRange)iSelect.createRange();

            // Create the link.
            if (txtRange.queryCommandEnabled("CreateLink"))
            {
                Object o = null;
                txtRange.execCommand("CreateLink", true, o);
            }
        }
    }
}


http://msdn.microsoft.com/zh-cn/library/system.windows.forms.htmlelement.domelement(VS.80).aspx

===========================================================
使用webbrowser和mshtml.dll获取网页源代码的问题
悬赏分:100 - 解决时间:2006-7-19 16:52
我使用C#做一个程序,其中涉及到一个功能,在输入指定网址之后,需要获取html源代码进行分析。 
我使用了webbrowser控件和mshtml.dll 
但是只能获取到普通页面的源代码 
一旦采集带有cookie控制的页面就会失败。 
谁能帮帮忙?

我对于webbrowser的使用并不很清楚,这个空间是否能直接获取html代码呢? 
mshtml.dll说是可以对html代码进行分析。但如何使用?

有谁能给出说明和源代码,感激不尽。
问题补充:我使用以下代码获取webbrowser中的html,但是有个很奇怪的问题。我每次点完按钮都会发现文本框中显示的html都不全,而且都把同一

页面的html显示了很多遍。如果页面内容较大则会引起程序死掉。 
为什么呢?
提问者: willgo - 助理 二级 最佳答案
private void button1_Click(object sender, System.EventArgs e) { 
object url=\"http://www.google.com\"; 
object nothing=null; 
this.axWebBrowser1.Navigate2(ref url,ref nothing,ref nothing,ref nothing,ref nothing); 
this.axWebBrowser1.DownloadComplete+=new System.EventHandler(this.button2_Click); 
}

private void button2_Click(object sender, System.EventArgs e) { 
this.textBox1.Text=\"\"; 
mshtml.IHTMLDocument2 doc=(mshtml.IHTMLDocument2)this.axWebBrowser1.Document; 
mshtml.IHTMLElementCollection all=doc.all; 
System.Collections.IEnumerator enumerator=all.GetEnumerator(); 
while(enumerator.MoveNext() && enumerator.Current!=null) 

mshtml.IHTMLElement element=(mshtml.IHTMLElement)(enumerator.Current); 
if(this.checkBox1.Checked==true) 

this.textBox1.Text+=\"\\r\\n\\r\\n\"+element.innerHTML

else 

this.textBox1.Text+=\"\\r\\n\\r\\n\"+element.outerHTML


}

=============
注意 本例程中使用了一个未公开的GUID,其在将来的系统中可以发生变更。

  1、定义 IOleCommandTarget 接口

  为定义一个.NET接口以获得关于一个COM接口的参考,请遵从下列步骤:

  1) 赋予.NET接口相应的COM接口的GUID值;

  2) 包含对接口中所有方法的类型声明;

  3) 包含对Mshtml.dll和Shdocvw.dll文件的参考,在Visual C# .NET工程中操作,请遵从:

  A. 在项目菜单下单击“添加引用”;

  B. 单击“COM” 选项卡;

  C. 双击“Microsoft HTML Object Library” 和“Microsoft Internet Controls”。

posted on 2011-11-10 10:40  h2内存数据库  阅读(262)  评论(0编辑  收藏  举报

导航