Как получить атрибуты нажатия элемента на web-странице в WPF пр

WPF
  1. 4 года назад

    Здравствуйте.
    Появилась задача по написания C#+WPF+MVVM приложения по анализу web-страниц. Кратко алгоритм выглядит следующим способом:

    1. В приложение встроена возможность отображения web-страниц.
    2. Пользователь выбирает какой-либо элемент на странице. Чаще это будут ссылки вида
    <a href="myhomepage.ru">My home page</a>

    3) Программа должна перехватить данное событие и определить источник события. Затем, получить код данного элемента, т.е. как раз

    <a href="myhomepage.ru">My home page</ a>

    Пробовал использовать стандартный WebBrowser, но все работает как-то долго и используя Microsoft HTML Object Library пока не вышло получить правильный результат.
    Смотрел в сторону Awesomium, но насколько я понял, для моей задачи придется использовать куски javascript кода, что не особо привлекательно.

    Не могли бы вы направить меня на более верный путь.

  2. Alexandr_Erohin

    Mar 2 Администратор
    Добавлено 4 года назад Alexandr_Erohin

    Пробовал использовать стандартный WebBrowser, но все работает как-то долго и используя Microsoft HTML Object Library пока не вышло получить правильный результат.

    А чем стандартные средства WPF не нравятся? У объекта WebBrowser есть специальное свойство ObjectForScripting через которое можно указывать класс с методами обработки вызовов JavaScript (концепция та же как и в приложениях ASP.NET с веб службами asmx). Для примера:

    <Grid>
            <WebBrowser x:Name="webBrowser" ></WebBrowser>
    </Grid>

    C#:

    using System;
    using System.Windows;
    using System.Runtime.InteropServices;
    using System.Security.Permissions;
    
    namespace WpfApplication1
    {
        // Вспомогательный класс, в контсрукторе должен принимать экземпляр окна, 
        // где находится WebBrowser
        [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
        [ComVisible(true)]
        public class ObjectForScriptingHelper
        {
            MainWindow mainWindow;
            public ObjectForScriptingHelper(MainWindow window)
            {
                mainWindow = window;
            }
    
            // Пример метода, который можно вызвать через JS
            public void InvokeFromJavascript(string text)
            {
                mainWindow.HtmlLinkText = text;
    
                // Для теста вывести разметку ссылки при клике по ней
                MessageBox.Show(text);
            }
        }
    }

    C#, отделенный код для окна

    public partial class MainWindow : Window
        {
            public string HtmlLinkText { get; set; }
    
            public MainWindow()
            {
                InitializeComponent();
    
                // Пример простого док-та
                webBrowser.NavigateToString(@"<html><meta charset=""utf-8"" /><body>
                    <a href=""http://google.com"" 
                        onclick=""javascript:window.external.InvokeFromJavascript(getHtml(this));return false;"">Ссылка 1</a>
                    <a href=""http://professorweb.ru"" 
                        onclick=""javascript:window.external.InvokeFromJavascript(getHtml(this));return false;"">Ссылка 2</a>
                    <a href=""http://yandex.ru"" 
                        onclick=""javascript:window.external.InvokeFromJavascript(getHtml(this));return false;"">Ссылка 3</a>
    <script>
        function getHtml(link) {
            var v = document.createElement('div');
            v.appendChild(link.cloneNode(true));
            return v.innerHTML;
        }
    </script>
                </body></html>");
    
                // Инициализация ObjectForScripting
                ObjectForScriptingHelper helper = new ObjectForScriptingHelper(this);
                webBrowser.ObjectForScripting = helper;
            }
        }

    При клике по ссылке будет вызываться метод InvokeFromJavascript() вспомогательного класса ObjectForScripting, в котором можешь делать что угодно, в данном примере отображается всплывающее окно с HTML-кодом ссылки по которой щелкнули.

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

    <a href="http://google.com">Ссылка</a>

    на

    <a href=""http://google.com"
                        onclick="javascript:window.external.InvokeFromJavascript(getHtml(this));">Ссылка</a>

    Соответственно вспомогательную функцию в JS также можно настроить под себя, в этом примере она возвращает разметку ссылки, по которой кликнули

    <script>
        function getHtml(link) {
            var v = document.createElement('div');
            v.appendChild(link.cloneNode(true));
            return v.innerHTML;
        }
    </script>
  3. Вот до ObjectForScripting так и не добрался. Спасибо за реализацию.
    Я принципе также делал через Awesomium. Только событие добавлял не через регулярные выражения, а просто прошелся по всем тегам <a> через JS и добавил атрибут onclick.

  4. 3 года назад

    Меня так же интересует такой способ, делаю приложение для своего сайта там в webbrowser нужно перехватить ссылки и кнопку button с id и вывести все в форме

или зарегистрируйтесь чтобы ответить