Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
.NET 4.x

WPF и WebKit

07.08.2015, 10:31. Показов 2345. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!

Пытаюсь подключить к wpf webkitbrowser. Использовала пример из интерента.

сначала я сделала такой грид:
XML
1
2
<Grid x:Name="grdBrowserHost">
</Grid>
потом я вызвала у окна событие loaded и в нём уже написала:
C#
1
2
3
4
5
6
7
8
9
10
11
12
System.Windows.Forms.Integration.WindowsFormsHost host =new System.Windows.Forms.Integration.WindowsFormsHost();
 
// Create the ActiveX control.
WebKit.WebKitBrowser browser = new WebKit.WebKitBrowser();
browser.Navigate("http://www.google.com");
 
// Assign the ActiveX control as the host control's child.
host.Child = browser;
 
// Add the interop host control to the Grid 
// control's collection of child controls. 
grdBrowserHost.Children.Add(host);
пример: ССЫЛКА

Затем я добавила ссылки на две dll (webkitbrowser и interope) в ссылках (reference) и подключила следующие библиотеки:

C#
1
2
3
4
using System.Windows.Forms.Integration;
using WebKit;
using WebKit.Interop;
using WebKit.DOM;
И когда я запускаю программу. то вот на этой строчке:

C#
1
WebKitBrowser browser = new WebKitBrowser();
ошибка:

Необработанное исключение типа "System.ComponentModel.Win32Exceptio n" произошло в WebKitBrowser.dll
Дополнительные сведения: Failed to initialize activation context

что делать, чтобы её исправить? как правильно подключить к wpf webkit?

Добавлено через 3 минуты
а, до этой ошибки была ошибка с библиотекой interop, исправила её - зашла в свойства библиотеки и на interop type = false (как было сказано здесь)

Добавлено через 3 часа 18 минут
upp

Добавлено через 10 часов 15 минут
upp
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.08.2015, 10:31
Ответы с готовыми решениями:

WebKit
Можете дать ссылку на движок webkit для delphi xe8? Хочу написать свой браузер! Добавлено через 27 секунд Прошу про TWebBrowser не...

WebKit
Здравствуйте форумчане. У меня проблема . Как открыть HTML документ который хранится в моем пк с помощью WebKit . Пробую так но не...

Qt и WebKit
Доброго всем дня. Подскажите, как подружить Qt 5.6 и WebKit? По разным источникам накачал кучу дополнительных компонентов, поставил... и...

11
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
07.08.2015, 10:46
Вот здесь Awesomium.NET - Home вроде уже есть готовый контрол для WPF. И это тоже вебкит. Скорей всего этот вариант лучше.
0
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
07.08.2015, 19:30  [ТС]
вэбкит я подключила, но не нашла там document.evaluate - подскажите, где это искать для работы с xpath
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
07.08.2015, 20:57
Лучший ответ Сообщение было отмечено Nullik как решение

Решение

Цитата Сообщение от Nullik Посмотреть сообщение
но не нашла там document.evaluate
Я не знаком с API этого контрола, так что подсказать не смогу. Это работает на странице, то есть если в этом контроле можно выполнить скрипт в контексте страницы (а скорей всего как-то можно), то можно пойти по этому пути.

Добавлено через 1 час 1 минуту
Набросал простейший пример с Awesomium. Он просто грузит Cyberforum и там есть вверху кнопочка, которая перекрашивает все ссылки на странице в зелененький. Ссылки ищет с помощью простейшего XPath //a.

Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfAwesomium"
        xmlns:awe="http://schemas.awesomium.com/winfx" x:Class="WpfAwesomium.MainWindow"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Button Grid.Row="0" Click="Button_Click" >Изменить цвет ссылок</Button>
        <awe:WebControl Name="webcontrol" Grid.Row="1" Source="https://www.cyberforum.ru"/>
 
    </Grid>
</Window>
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
40
41
42
43
44
45
46
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace WpfAwesomium
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
 
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var script = @"
var links = document.evaluate('//a', document, null, XPathResult.ANY_TYPE, null); 
 
var currentLink = links.iterateNext();
            
            while (currentLink)
            {
                currentLink.style.color = ""green"";
                currentLink = links.iterateNext();
            }
            ";
            webcontrol.ExecuteJavascript(script);
            
        }
    }
}
1
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
07.08.2015, 22:23  [ТС]
это он скрипт отправляет, подобный пример на мазиловском сайте я видела (всё думала, что такое документ в этом случае?)

у геко движка есть встроенный xpath, но сейчас не получается его подключить (хех, а завтра с бубном получится)))

Спасибо за пример!
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
08.08.2015, 10:09
Лучший ответ Сообщение было отмечено Nullik как решение

Решение

Nullik, разобрался как в авесомиуме выполнить код, написанный на C#, но с использованием динамиков. Выполняется код очень долго, приведенный пример у меня крутится 25 секунд, так что вряд ли это подходящий вариант, но видимо его можно использовать как-то иначе, например для внедрения скрипта в страницу или еще чего. Просто даю для информации. Код XAML тот же, а вот код C# немного изменился.
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
using System.Windows;
using Awesomium.Core;
namespace WpfAwesomium
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
 
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            JavascriptExecutionContextMethod contextMethod = (Global g) =>
            {
                dynamic nodes = g.document.evaluate("//a", g.document, null, g.window.XPathResult.ANY_TYPE, null);
                dynamic currentNode = nodes.iterateNext();
                while (currentNode)
                {
                    currentNode.style.color = currentNode.style.color == "green" ? "red" : "green";
                    currentNode = nodes.iterateNext();
                }
            };
            webcontrol.CreateJavascriptExecutionContext(contextMethod);
        }
    }
}
Добавлено через 35 минут
А вот джинерик-версия метода.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            JavascriptExecutionContextMethod<string> contextMethod = (Global g, string xpath) =>
            {
                dynamic nodes = g.document.evaluate(xpath, g.document, null, g.window.XPathResult.ANY_TYPE, null);
                dynamic currentNode = nodes.iterateNext();
                while (currentNode)
                {
                    currentNode.style.color = currentNode.style.color == "green" ? "red" : "green";
                    currentNode = nodes.iterateNext();
                }
            };
            webcontrol.CreateJavascriptExecutionContext(contextMethod, "//a[contains(.//text(), 'C#')]");
        }
Данный код работает намного быстрее, поскольку узлов, нуждающихся в обработке меньше. Поначалу подумал, что просто джинерик-метод более быстрый, но тут видимо время занимает не взаимодействие с яваскриптом, сама итерация по узлам.
1
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
08.08.2015, 10:35  [ТС]
ну вывод примерно такой: xpath в webkit работает через скрипт или ручной вызов скрипта (второй вариант который).

Ога, понятно!
Тогда первый вариант проще использовать))
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
08.08.2015, 11:04
Цитата Сообщение от Nullik Посмотреть сообщение
ручной вызов скрипта (второй вариант который)
Ну я бы не стал так это называть, ну да ладно
Цитата Сообщение от Nullik Посмотреть сообщение
Тогда первый вариант проще использовать))
Насчет проще, тут тоже все не так однозначно. Во-первых, как минимум, надо знать JavaScript. Во-вторых, работа с текстом, который надо модифицировать(например подставлять XPath или менять инструкции обработки для каждаого XPath), нередко преподносит свои сюрпризы. В-третьих, первый вариант исполняется полностью на движке JavaScript и таким образом у тебя нет возможности выполнить какую-то обработку средствами C# и фреймворка, в то время как второй вариант работает в коде программы.
Ну и задержки все-таки вываливаются когда в коде надо много чего делать. Например в данном случае итерация по узлам подразумевает включение сложного механизма взаимодействия DLR с движком JavaScript. Если к примеру надо выполнить небольшой набор инструкций, то я бы второй вариант предпочел. Так что в принципе надо найти какой-то средний путь, например: второй вариант использовать для внедрения скрипта в страницу, а потом вызывать функции этого скрипта, которые уже будут выполняться на движке JavaScript. Ну, а дальше в принципе возможны разные комбинации использования того и другого.
Также есть еще вариация первого примера, но с возвратом значения. Например можно попробовать внедрить метод обработки запросов, а потом вызвать таким способом и результат уже обрабатывать в коде C#. Правда сначала лучше закинуть все найденное в массив, иначе может так получиться, что при вызове iterateNext опять будет выполняться запрос к JavaScript-движку.
Короче: надо ковыряться, чтобы найти оптимальные пути для всего.
0
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
08.08.2015, 12:01  [ТС]
у меня задача небольшая - открыть сайт, по указаному xpath достать элемент (допустим это textbox) и ввести туда какое-нибудь слово. Потом по другому xpath найти, допустим, кнопку - нажать на кнопку.

Но проблема в том, что таких вот действий будет много, но они все вызываются по очереди.

Добавлено через 27 секунд
своего рода безобидный бот-полупарсер
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
08.08.2015, 12:02
Цитата Сообщение от Nullik Посмотреть сообщение
Но проблема в том, что таких вот действий будет много, но они все вызываются по очереди.
Тогда скорей всего принципиальной разницы нет.
0
0 / 0 / 0
Регистрация: 13.06.2015
Сообщений: 23
18.03.2016, 12:54
Если не трудно, скиньте пример WebKit c WPF . Ничего не получается ((
0
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
19.03.2016, 17:36  [ТС]
я делала по примеру, ссылка которого находился в шапке темы. А проект я переделывала. не брала вэбкит, поэтому не сомгу кинуть как у меня там заработало. Там просто не хватало каких-то dll.

Добавлено через 10 минут
я делала по примеру, ссылка которого находился в шапке темы. А проект я переделывала. не брала вэбкит, поэтому не сомгу кинуть как у меня там заработало. Там просто не хватало каких-то dll.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.03.2016, 17:36
Помогаю со студенческими работами здесь

Использование -webkit
Зачем нужно использовать, к примеру, -webkit-border-bottom-left-radius, если можно использовать border-bottom-left-radius Я тему...

WebKit вместо IE
Как мне подключить движок WebKit дл браузера? пробывал на Visual basic.NET но там ниче у меня не получилось:(

Не работает webkit
Не работает webkit, браузер (гугл) просто не принимает строчки с '-webkit-'. &lt;!DOCTYPE html&gt; &lt;html lang=&quot;en&quot;...

InvokeMember в Webkit
Всем привет, есть задача кликнуть на кнопку на одном сайте. Раньше (с IE) делал это с помощью invokemember(&quot;Click&quot;) Пробовал...

Webkit VB6
Добрый день! Подскажите пожалуйста по браузеру webkit Мануал читал, то что мне нужно не нашёл, по форуму так же искал... Интересуют...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru