在WebBrowser控件中绕过“查找”对话框

时间:2012-09-10 14:23:27

标签: c# search find webbrowser-control

我需要实现“查找”对话框提供的“搜索”功能,当按下Ctrl + F时,该对话框会弹出。

我有一个文本框,用户输入要搜索的字符串,以及“搜索”按钮。单击按钮时,需要突出显示HTML文档中的匹配项 - 与“查找”对话框中实现的完全相同。

有没有办法绕过WebBrowser控件中的“查找”对话框?是否可以将搜索参数发送到“查找”功能?

提前感谢您的帮助。

修改

理想情况下,我可以使用“查找”对话框提供的全部功能,包括“仅匹配整个世界”,“匹配大小写”和“突出显示所有匹配项”......

2 个答案:

答案 0 :(得分:0)

自己并不难做到,所有你做的就是用以下内容替换Search TextBox中的任何内容,比如搜索术语是“hello”,然后用以下内容替换hello的所有出现:

<font color="yellow">hello</font>

当然,这个HTML可以替换为SPAN标记(这是DIV标记的内联版本,因此您的行不会使用SPAN中断,但会使用DIV)。但在任何一种情况下,这两个标签都有一个样式属性,你可以使用CSS来改变它的颜色或其他与CSS兼容的其他属性,如下所示:

<SPAN style="background-color: yellow;">hello</SPAN>

当然,还有很多其他方法可以使用HTML更改颜色,如果需要,可以随意在网上搜索。

现在,您可以使用dotnet中的.Replace()函数来执行此操作(替换搜索到的文本),这非常简单。因此,您可以使用.DocumentText将整个文档作为字符串获取,并且一旦所有出现被替换(使用.Replace()),您可以将其设置回.DocumentText(所以,您使用.DocumentText来获取原始文档字符串,并使用替换的字符串设置.DocumentText)。当然,您可能不希望对实际HTML中的项目执行此操作,因此您可以通过对所有元素执行For Each循环来遍历页面上的所有元素,如下所示:

For Each someElement as HTMLElement in WebBrowser1.Document.All

每个元素都有一个.InnerText / .InnerHTML和.OuterText / .OuterHTML,你可以获取(读取)和设置(用替换文本覆盖)。

当然,根据您的需要,您可能只想更换和覆盖.InnerText和/或.OuterText。

如果您需要更多帮助,请与我们联系。在任何一种情况下,无论如何,我想知道它是如何成功的,或者我们中是否还有更多可以为您的问题增加价值。欢呼声。

答案 1 :(得分:0)

我遇到了很多困难,但我终于找到了解决方案。它有些混乱,但它可以像Winforms WebBrowser控件一样工作。这是在.Net 4.0中导入的Microsoft.mshtml 7.0.3300引用。

using mshtml;

private int _findClicks = 0;
private string _searchText = "";

public string SearchText
    {
        get { return _searchText; }
        set
        {
            if (value.ToUpper() != _searchText)
            {
                ClearFind();
                _searchText = value.ToUpper();
                txtSearch.Text = value.ToUpper();

                _findClicks = 0;
            }
        }
    }

private void btnSearch_Click(object sender, EventArgs e)
    {
        SearchText = txtSearch.Text;
        if (_findClicks == 0)
            FindFirst();
        else
            FindNext();
    }

 /// <summary>
    /// Search through all text to find. Sets all occurrences to background color yellow.
    /// </summary>
    private void FindFirst()
    {
            if (_searchText == "")
                return;
            IHTMLDocument2 doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
            IHTMLSelectionObject sel = doc.selection;
            IHTMLTxtRange range = sel.createRange() as IHTMLTxtRange;
            //Mark all occurrences with background color yellow
            while (true)
            {
                if ((range.findText(_searchText)) && (range.htmlText != "span style='background-color: yellow;'>" + _searchText + "</span>"))
                {
                    range.pasteHTML("<span style='background-color: yellow;'>" + _searchText + "</span>");
                }
                else
                    break;
            }
            //Move to beginning and select first occurence.
            range.moveStart("word", -9999999);
            range.findText(_searchText);
            range.select();
            _findClicks++;
        }

/// <summary>
    /// Finds next occurrence of searched text and selects it.
    /// </summary>
    private void FindNext()
    {
            if (_searchText == "")
                return;
            IHTMLDocument2 doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
            IHTMLSelectionObject sel = doc.selection;
            IHTMLTxtRange range = sel.createRange() as IHTMLTxtRange;
            range.collapse(false); // collapse the current selection so we start from the end of the previous range

            if (range.findText(_searchText, 1000000, 0))
            {
                range.select();
            }
            else // If at end of list, go to beginning and search one more time.
            {
                range.moveStart("word", -9999999);
                if (range.findText(_searchText, 1000000, 0))
                {
                    range.select();
                }
            }
    }

/// <summary>
    /// Remove highlighting on all words from previous search.
    /// </summary>
    private void ClearFind()
    {
            if (_searchText == "" || webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                return;
            IHTMLDocument2 doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
            IHTMLSelectionObject sel = doc.selection;
            IHTMLTxtRange range = sel.createRange() as IHTMLTxtRange;
            range.moveStart("word", -9999999);
            while (true)
            {
                if ((range.findText(_searchText)) && (!range.htmlText.Contains("span style='background-color: white")))
                {
                    range.pasteHTML("<span style='background-color: white;'>" + _searchText + "</span>");
                }
                else
                    break;
            }

    }

同样,这有点凌乱,可能会被清理一下。这几乎复制了Web浏览器控件中Ctrl + F功能的基础知识。希望它对所有未来的读者都有帮助。