2013-03-20 25 views
1

我是C#的初学者,我有一个问题。 我每次在搜索请求后在web浏览器控件中找到某个位置时都需要弹出一个消息框,此时将选择该位置。 我正在使用计时器刷新webBrowser并再次启动搜索。这就像通知系统。如何搜索WebBrowser上的文本?

using System; 
using System.Windows.Forms; 
using mshtml; 

namespace websearch 
{ 

public partial class Form1 : Form 
{ 
    Timer temp = new Timer(); 
    //Timer refreshh = new Timer(); 
    public Form1() 
    {   
     InitializeComponent(); 
     temp.Tick += new EventHandler(refreshh_Tick); 
     temp.Interval = 1000 * 5; 
     temp.Enabled = true; 
     temp.Start(); 
     WebBrowser1.Navigate("http://stackoverflow.com/"); 
    } 

    void refreshh_Tick(object sender, EventArgs e) 
     { 
      WebBrowser1.Refresh(); 
      WebBrowser1.DocumentCompleted += Carder_DocumentCompleted; 
     } 

    private void Carder_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      FindNext("C#", WebBrowser1); 
      temp.Tick += refreshh_Tick; 
     } 
    public void FindNext(string text, WebBrowser webBrowser2) 
     { 

      IHTMLDocument2 doc = webBrowser2.Document.DomDocument as IHTMLDocument2; 
      IHTMLSelectionObject sel = doc.selection; 
      IHTMLTxtRange rng = sel.createRange() as IHTMLTxtRange; 

      rng.collapse(false); // collapse the current selection so we start from the end of the previous range 
      if (rng.findText(text)) 
       { 
       rng.select(); 
       MessageBox.Show("Theire are new C# Question");    
       } 

     } 
    } 

} 

回答

3

有几种方法可以做到这一点:

  1. 创建一个递归函数通过所有HtmlElement s到分析和检查的内容。如果你要求的文本存在时,您可以选择元素,或改变的元素风格或者其他任何你可能想要做的。

如:

public bool SearchEle(HtmlElement ele, string text) 
{ 
    foreach (HtmlElement child in ele.Children) 
    { 
     if (SearchEle(child, text)) 
      return true; 
    } 
    if (!string.IsNullOrEmpty(ele.InnerText) && ele.InnerText.Contains(text)) 
    { 
     ele.ScrollIntoView(true); 
     return true; 
    } 

    return false; 
} 
  1. 您使用webBrowser2.Document.Body.InnerText,做一个字符串搜索。这是如果你不打算实际上突出显示文本,但只是想找到文本。

在另一方面,你可能希望将代码移动WebBrowser1.DocumentCompleted += Carder_DocumentCompleted;Form1()构造函数而不是做每一次刷新功能refreshh_Tick被称为它的。

+0

假设你搜索''

find me (the first one) I am the second me the rest.
找到'me',你的代码不能先找到我。 – Ahmad 2015-04-19 10:51:16

+0

只需交换'foreach'和'if'块。 – 2015-04-20 03:17:45

+0

如果第一个'if'可以找到它的文本'innerText'那么就没有必要寻找孩子,因为'的元素innerText'包含其孩子的'innerText' – Ahmad 2015-04-28 13:56:16