Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: WebBrowser отображение текста ссылки

Всем доброго времени суток!

Как в C# можно сделать аналог расшифровки ссылки при наведении курсора в WebBRowser?

Студия 2010.
Ответ: Я немножко поэкспериментировал.
Событие MouseMove в стандартном компоненте WebBrower не работает. Пишут, что можно переопределить WndProc:
class MyBrowser : WebBrowser
{
    protected override void WndProc(ref Message m)
    {
        const int WM_MOUSEMOVE = 0x0200;
        if (m.Msg == WM_MOUSEMOVE)
        {
            Debug.WriteLine("foo");
        }
        else base.WndProc(ref m);
    }
}
Однако, это не заработало.

Тогда сделал костылик - заюзал таймер.
var browser = new WebBrowser
{
    Parent = this,
    Dock = DockStyle.Fill,
    ScriptErrorsSuppressed = true
};
browser.Navigate("yandex.ru");

var timer = new Timer();
timer.Tick += (o, e) =>
{
    if (browser.Document != null)
    {
        HtmlElement elem = browser.Document.GetElementFromPoint(browser.PointToClient(MousePosition));
        if (elem != null)
        {
            if (string.Compare(elem.TagName, "A", true) == 0)
                this.Text = elem.GetAttribute("href");
        }
    }
};
timer.Start();

Работает. Текст ссылок показывает. Но только текст прямых ссылок. Если в <a> вложен какой-нибудь другой тэг, то нужно вверх по дереву пройтись до тэга A.
Вопрос: WebBrowser LoadCompleted не запускается

internal void GetPosition()
        {
            _webBrowser = new WebBrowser();
            _webBrowser.Visibility = Visibility.Hidden;
            var location = Assembly.GetExecutingAssembly().Location;
            _webBrowser.LoadCompleted += webBrowser_LoadCompleted;
            _webBrowser.Navigate(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\Location.html");
        }


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <meta http-equiv="X-UA-Compatible" content="IE=10" />
    <script type="text/javascript">
        window.onload = function () {
            var latitude = document.getElementById("latitude");
            var longitude = document.getElementById("longitude");
            var error = document.getElementById("error");

            function getLocation() {
                if (navigator.geolocation) {
                    navigator.geolocation.getCurrentPosition(success, error, options);
                }
            }

            var options = {
                enableHighAccuracy: true,
                timeout: 5000,
                maximumAge: 0
            };

            function success(position) {
                latitude.value = position.coords.latitude;
                longitude.value = position.coords.longitude;
            };

            function error(err) {
                error.value = 'ERROR(' + err.code + '): ' + err.message;
            };


            function showPosition(position) {
                latitude.value = position.coords.latitude;
                longitude.value = position.coords.longitude;
            }
            getLocation();
        }
    </script>
</head>
<body>
    <input type="hidden" id="latitude" />
    <input type="hidden" id="longitude" />
    <input type="hidden" id="error" />
</body>
</html>


В чем может быть проблема, почему метод не запускается?
Ответ: Axeleron,

честно скажу, даже представить сложно, где этот контрол WebBrowser, может реально пригодится. По моему, это полнейшая шляпа
Вопрос: WinForms Chart внутри WebBrowser

Добрый день, уважаемые коллеги.
А делал ли кто-то из вас следующее? Есть WinForms приложение. В нём - отчёт достаточно сложной структуры - таблицы, графики. Для показа отчёта хочется использовать стандартный контрол WebBrowser. А внутри него для показа графиков - стандартный контрол Chart. Возможно ли такое изобразить?
Ответ:
alex_iva1
Добрый день, уважаемые коллеги.
А делал ли кто-то из вас следующее? Есть WinForms приложение. В нём - отчёт достаточно сложной структуры - таблицы, графики. Для показа отчёта хочется использовать стандартный контрол WebBrowser. А внутри него для показа графиков - стандартный контрол Chart. Возможно ли такое изобразить?


внутри броузера показывайте всё, что броузер показывает. У контрола есть некоторые ограничения по сравнению со взрослым броузером, но это не существенно.
Вопрос: WebBrowser автопереход по ссылке

Имеется html

<a href="javascript:BuyMarketListing('listing', '687162012910341614', 570, '2', '7499115465')" class="btn_green_white_innerfade btn_small">


как можно эмулировать нажатие на данную ссылку из WebBrowser?
Ответ: Fireman13,

Проблему решил. Поменял версию IE в webbrowser.
Вопрос: Ожидание загрузки страницы в WebBrowser

Суть проблемы - мне нужно чтобы после полной загрузки страницы он возвращался в button1_Click. Но если мы сделаем что то типа ожидания while (goNext) { ... } то wb просто не хочет отправлять запрос или присылать ответ и LoginPassword если поставить брекпоинт никогда выполнен не будет. Как решить этот вопрос и как вернуться обратно?
Или как сделать чтобы он ждал загрузку страницы а только потом выполнял какие то действия.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void button1_Click(object sender, EventArgs e)
        {
            webBrowser.ScriptErrorsSuppressed = true;
            webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(LoginPassword);
            webBrowser.Navigate("www.good73.net");
 
            while (goNext) { System.Threading.Thread.Sleep(3000); }
 
            string aaaa = "";
        }
 
        private void LoginPassword(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            // Тут что то делаем ну и потом возвращаемся в button1_Click
 
            goNext = false;
        }
Добавлено через 36 минут
С этим проблему решил, но стала другая проблема.
Страницы автоматически обновляются и у меня пришел ответ я его сохранил а потом только страница обновлилась и ответ уже другой. Как быть чтобы дожидалось всех обновлений страницы?
Ответ: Обратите внимание на асинхронное объявление Button1_Click

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
        private async void button1_Click(object sender, EventArgs e)
        {
            
            webBrowser.ScriptErrorsSuppressed = true;
            webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(LoginPassword);
            webBrowser.Navigate("http://www.google.com"); 
            await PageLoad(10);
            string aaaa = "";
            MessageBox.Show(aaaa);
        }
 
        private void LoginPassword(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            // Тут что то делаем ну и потом возвращаемся в button1_Click
 
            MessageBox.Show("LoadingPassword");
        }
 
        private async Task PageLoad(int TimeOut)
        {
            TaskCompletionSource<bool> PageLoaded = null;
            PageLoaded = new TaskCompletionSource<bool>();
            int TimeElapsed = 0;
            webBrowser.DocumentCompleted += (s, e) =>
            {
                if (webBrowser.ReadyState != WebBrowserReadyState.Complete) return;
                if (PageLoaded.Task.IsCompleted) return; PageLoaded.SetResult(true);
            };
            //
            while (PageLoaded.Task.Status != TaskStatus.RanToCompletion)
            {
                await Task.Delay(10);
                TimeElapsed++;
                if (TimeElapsed >= TimeOut * 100)
                {
                    PageLoaded.TrySetResult(true);
                }
            }
        }
Вопрос: Страницы WebBrowser

Здравствуйте.
На форме компонент WebBrowser, в WebBrowser отрывается страница моего мира my.mail.ru.
На этой странице есть лента новостей на которой есть такие надписи:
Страницы WebBrowser
Страницы WebBrowser
После перехода в "приложения", лента новостей показывает только игровые приложения.
Вот теперь и вопрос:
Возможно программным путем сделать, что бы после перезагрузки страницы в WebBrowser,
сразу загружалась уже страница только с приложениями?
Если возможно, то как это реализовать?
Ответ: WebBrowser это по сути браузер IE7. Можно сделать чтобы он работал как IE более старших версий, но для этого в реестре нужно что-то править, точно не знаю что именно. Поэтому все ограничения для IE7 будут касаться и WebBrowser, т.к. IE7 это достаточно устаревший браузер. Если сайт, с которым Вы работаете, требует более старших версий IE, то да проблемы могут возникнуть...
А что Вы хотите сделать с этим списком? Если Вам нужна ссылка определённая, ну так найдите её через DOM и сделайте переход по ней.
Вопрос: Подписка WebBrowser на событие DocumentCompleted

Доброго времени суток.. Писал маленькую прогу , для неё нужно было получить Token
При его получении нужно было пользовать Webbrowser .. После написания приложения решил его убрать (не убрать а скрыть или изменить кому как удобно) Dim web as new webbrowser .. но столкнулся с небольшой неприятностью ..
в приложении использую
vb.net
1
WebBrowser1_DocumentCompleted
при смене всех webbrowser1 естественно всё нормально работало .. Но как изменить тут?--->
vb.net
1
 Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
в нём выполняются основные функции
Ответ: поясню опять и отвечу на вопрос.. Есть авторизация через webbrowser в vk.com
пока делал для получения Token'a таким образом..
после того как всё заработало решил с формы убрать сам webbrowser b заменить его dim Web as new webbrowser
Но в программе учавсвует WebBrowser1_DocumentCompleted и по сути выполяет большую часть..
если убрать webbrowser , то естественно WebBrowser1_DocumentCompleted работать не будет..
вопрос заключался в том , каким образом можно его изменить чтобы WebBrowser1_DocumentCompleted
работал без webbrowser1 // а с dim Web as new webbrowser ..
в ответе выше был пример.. Но выдаёт ошбку.. Как вставлял? как написанно так и вставил ..
Вопрос: Многопоточный WebBrowser

может кто накидать простенький код с примером многопоточного webbrowser'а.допустим чтоб открывал в несколько потоков одну и ту же страницу(просто к примеру) или выполнял какие-то элементарные действия(неважно что,главное чтобы запустился веббраузер в несколько потоков).вариант накинуть на форму несколько контролов вебраузера очень очень плохой вариант ,прийдеться им воспользоваться в самом крайнем случае.
вот моя предыдущая тема с проблемой
через веббраузер она решается сама собой,но он очень сильно уступает по скорости и ресурсозатратам

нашел одно из решений вот тут * не реклама
решается вот так ,но пока не понял как это применить + там решение для нескольких екземпляров Webbrowser,возможно ли это применить к одному webbrowser'у ,если да то каким образом это реализовать проще всего ?
thread.SetApartmentState(ApartmentState.STA);
Ответ: OwenGlendower,спасибо помогло Application.Run() Application.ExitThread()
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Public Function browme() As Integer
 
 
        ''''''''''''''''''''''''''''''''''''''''''''
        Try
            Dim x As Integer
 
            Dim wb As New WebBrowser()
            wb.ScriptErrorsSuppressed = True
            AddHandler wb.DocumentCompleted, AddressOf OnLoad
            wb.Navigate("https://www.url.com")
           
            
 
 
 
            Application.Run()
 
            x = x + 1
            browme = x
 
        Catch ex As Exception
 
        End Try
    End Function
 
 
Private Sub OnLoad()
 
        Application.ExitThread()
    End Sub
у меня теперь другой вопрос,каким образом можно передать в Onload Webbrowser(или какие-то данные из него к примеру куки)? он у меня обьявлен внутри функции и онлоаду он не виден,думал о том чтобы обьявить глобальный веббраузер и передавать туда данные из веббраузера в функции,но не уверен в том будет ли у всех потоков доступ к глобальному веббраузеру одновременно.
или может возможно какими-то другими путями по событию полной загрузки страницы открыть другую страницу с куками от первой страницы в том же потоке

Добавлено через 57 секунд
пробовал через while и If wb.ReadyState = WebBrowserReadyState.Complete Then не получается

Добавлено через 35 минут
разобрался

в функции
vb.net
1
2
 AddHandler wb.DocumentCompleted, New _
        WebBrowserDocumentCompletedEventHandler(AddressOf PrintDocument)

vb.net
1
2
Private Sub PrintDocument(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
        Dim webBrowserForPrinting As WebBrowser = CType(sender, WebBrowser)
Вопрос: WebBrowser + MultiThreading

Приветствую!
Есть задача в простой постановке: Грид, в котором каждая строчка содержит ссылку на веб-страницу. На веб-странице некие данные, которые надо обсчитать и вывести в этот же грид.
Чтобы скачивать страницы с данными используется компонент Web Browser, поскольку данные на страницу подкачиваются через JQuery и ResponseByRequest дает страницу без данных.
Чтобы грид был доступен в момент обсчета создается фоновый поток:
                var th = new Thread(() => DoWork());
                th.SetApartmentState(ApartmentState.STA);
                th.Start();

Из потока данные пишутся в грид. Внутри потока строки грида обсчитываются последовательно.

Ещё важный момент, поскольку компонент WebBrowser работает асинхронно, то мне надо дождаться пока страница загрузится. В классическом понимании это делается через обработчик события DocumentCompleted. Однако событие наступает раньше, чем отрабатывают все JavaScript-ы, поэтому приходится делать кустарный метод:
            WebBrowser wb = new WebBrowser();
            wb.ScriptErrorsSuppressed = true;
                    int i = 0;
string PageResult = String.Empty;

                    while (i < 60 && !IsDownloaded(PageResult))
                    {
                        Wait(0.5);
                        if (wb.Document != null)
                        {
                            try
                            {
                                PageResult = ((mshtml.HTMLDocument)(wb.Document.DomDocument)).documentElement.innerHTML;
                            }
                            catch { }
                        }
                        else
                        {
                            PageResult = String.Empty;
                        }
                        i++;
                    }

где IsDownloaded - кустарный метод проверки, что все данные уже есть на странице, а функция Wait - ожидание потока без его остановки:
        private void Wait(double seconds)
        {
            int ticks = System.Environment.TickCount + (int)Math.Round(seconds * 1000.0);
            while (System.Environment.TickCount < ticks)
            {
                Application.DoEvents();
            }
        }


Обсчет занимает продолжительное время и мне в голову приходит замечательная идея! Обсчет каждой строчки выкинуть в отдельный поток, а потом дождаться самого медленного и закончить обработку.
Я делаю, всё работает, но проявляется проблема: на 4-5 потоке компонент WebBrowser перестает работать, причем в прямом смысле, сколько бы не прошло времени - страница даже не начинает качаться, wb.Document == null
Причем на моем компе всё работает корректно, а на трех других, до которых я смог дотянуться и проверить - нет.
Убираю многопоточность - опять всё в норме.
Почему WebBrowser может так себя вести в многопоточных приложениях?
Ответ:
ЕвгенийВ
Oblom811,
1. посмотри куда лезет JQuery, наверняка какой нибудь webapi, можно качать с помощью

Так в итоге и решил.

За ссылку спасибо, изучу.
Вопрос: WebBrowser с биндингом подвешивает интерфейс, если пдф-файл большого размера

Есть WebBrowser, есть пдф-ка на 400 страниц, весит 230 метров. Если задать путь к файлу прямо в кзамле, то все ок, ничего не тормозит. Вот так.

<WebBrowser Name="_pdfViewer" Source="D:/pdf/LargeFile.pdf"/>


Но я не могу задать путь статически, путь будет меняться, поэтому мне нужен Binding. Я использую такой Behavior. И вот когда я задаю путь через биндинг, то интерфейс подвисает на 2-3 минуты. С файлами меньших размеров (страниц на 50-100) проблем не возникает. Я пока точно не выяснил при каком количестве страниц или при каком размере файла начинаются тормоза. Но, имхо это и не существенно, файл то я тестировал один и тот же. Существенно понять почему через Binding тормозит.

<WebBrowser Name="_pdfViewer" 
            Behaviors:WebBrowserUtility.BindableSource="{Binding FilePath}"/>


public static class WebBrowserUtility
{
    public static readonly DependencyProperty BindableSourceProperty =
        DependencyProperty.RegisterAttached("BindableSource", typeof(String), typeof(WebBrowserUtility), new UIPropertyMetadata(null, BindableSourcePropertyChanged));

    public static String GetBindableSource(DependencyObject obj)
    {
        return (String)obj.GetValue(BindableSourceProperty);
    }

    public static void SetBindableSource(DependencyObject obj, String value)
    {
        obj.SetValue(BindableSourceProperty, value);
    }

    public static void BindableSourcePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        var browser = o as WebBrowser;
        if (browser == null) return;
        var uri = e.NewValue as String;

        browser.Source = !String.IsNullOrEmpty(uri) ? new Uri(uri) : null;
    }
}
Ответ: Вопрос снят, я ошибся. Пути были разные, один (в кзамле) был локальным, второй (через биндинг) вел на сетевой диск. Есесно он качается по сети, вот и вся проблема