Nano Hash - криптовалюты, майнинг, программирование

Обход диалогового окна поиска в элементе управления WebBrowser

Мне нужно реализовать функцию поиска, предоставляемую диалоговым окном «Найти», которое появляется при нажатии Ctrl + F.

У меня есть текстовое поле, в котором пользователь вводит строку для поиска, и кнопку «Поиск». При щелчке по кнопке совпадения в документе HTML должны быть выделены - точно так же, как это реализовано в диалоговом окне «Найти».

Есть ли способ обойти диалоговое окно «Найти» в элементе управления WebBrowser? Можно ли передать параметры поиска в функцию "найти"?

Заранее спасибо за помощь.

ИЗМЕНИТЬ

В идеале я мог бы использовать все функции, предоставляемые диалоговым окном «Найти», включая «Только сопоставить весь мир», «Подобрать регистр» и «Выделить все совпадения» ...


Ответы:


1

Это не так сложно сделать самому, все, что вы делаете, это заменяете все, что находится в текстовом поле поиска, следующим образом, скажем, поисковым запросом является «привет», затем вы заменяете все случаи приветствия следующим образом:

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

Конечно, этот HTML-код можно заменить тегом SPAN (который является встроенной версией тега DIV, поэтому ваши строки не будут прерывать использование SPAN, но будут использовать DIV). Но в любом случае оба этих тега имеют атрибут стиля, в котором вы можете использовать CSS, чтобы изменить его цвет, или множество других свойств, совместимых с CSS, например:

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

Конечно, есть миллион других способов изменить цвет с помощью HTML, не стесняйтесь поискать в Интернете больше, если хотите.

Теперь вы можете использовать функцию .Replace () в dotnet, чтобы сделать это (заменить искомый текст), это очень просто. Таким образом, вы можете получить весь документ в виде строки, используя .DocumentText, и как только все события будут заменены (с помощью .Replace ()), вы можете вернуть его в .DocumentText (так что вы используете .DocumentText, чтобы получить исходный строка и установка .DocumentText с замененной строкой). Конечно, вы, вероятно, не захотите делать это с элементами внутри фактического HTML, поэтому вы можете просто перебрать все элементы на странице, выполнив цикл For Each для всех элементов, как показано ниже:

For Each someElement as HTMLElement in WebBrowser1.Document.All

И каждый элемент будет иметь .InnerText / .InnerHTML и .OuterText / .OuterHTML, которые вы можете получить (прочитать из) и установить (перезаписать замененным текстом).

Конечно, для ваших нужд вы, вероятно, просто захотите заменить и перезаписать .InnerText и / или .OuterText.

Если вам нужна дополнительная помощь, дайте мне знать. В любом случае, я хотел бы знать, как это все сработало для вас, или есть ли что-то еще, что кто-либо из нас может сделать, чтобы повысить ценность вашей проблемы. Ваше здоровье.

13.09.2012
  • Спасибо, я вернусь к вам через несколько дней, так как сейчас я работаю над чем-то другим. 14.09.2012
  • @ Рэйчел фантастическая, я надеюсь, что это решит вашу проблему, если нет, мы будем работать над этим вместе. просто из любопытства, я не сразу понял из вашего сообщения, появляется ли диалоговое окно «Найти», которое обычно появляется в Internet Explorer, в элементе управления WebBrowser, размещенном внутри WinForm, когда вы нажимаете ctrl + f? Действительно ли диалоговое окно ctrl + f отображается в элементе управления WebBrowser, размещенном в настраиваемом приложении Win32? 15.09.2012
  • @ Рэйчел, ты в конце концов попробовала? 22.09.2012
  • Извините, но у меня не было времени, а может, и несколько недель, потому что я очень занят работой над чем-то другим. Я обязательно попробую это в конце концов, и дам вам знать, как это происходит. 22.09.2012
  • Хотя это может сработать, это не совсем то, что я хотел. Выделение текста в html-документе - это не то же самое, что использование функции поиска в элементе управления браузера, которая включает регистр совпадений, соответствие только целому слову и т. Д. каким-то образом фактически использовать функцию поиска, не изобретая велосипед. 20.11.2012
  • Я обновил вопрос для уточнения. (И извините, что так долго не отвечал.) 20.11.2012
  • Привет, Рэйчел, если вы действительно хотите использовать диалоговое окно «Найти», можно использовать ловушки Windows и / или подклассы Windows (обе темы в некоторой степени связаны). Вы можете получить инструкции о том, как это сделать, но я должен предупредить вас, что это трудные / сложные вещи. На торрент-сайтах также есть книга о хуках / подклассах, которую вы можете скачать и прочитать или просто просмотреть перед покупкой. Вот ссылка на главу 1, опубликованная oreilly: oreilly.com/catalog/subhookvb/chapter /ch01.html. Учитывая сложность, я думаю, что создание собственного метода с использованием текстовых подпрограмм было бы намного проще, как вы думаете? 03.06.2013

  • 2

    У меня было много трудностей с этим, но я наконец нашел решение, работающее. Это несколько беспорядочно, но работает так, как задумано для элемента управления 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;
                }
    
        }
    

    Опять же, это несколько беспорядочно, и, вероятно, его можно было бы немного очистить. Это в значительной степени повторяет основы функции Ctrl + F в элементе управления веб-браузера. Надеюсь, это поможет всем будущим читателям.

    04.11.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..