С Новым годом! Форум программистов, компьютерный форум, киберфорум
edmonsur
Войти
Регистрация
Восстановить пароль

Оживить vb.net при помощи WebView2 элемента

Запись от edmonsur размещена 14.08.2024 в 08:52
Показов 26890 Комментарии 1
Метки .net, vb.net

WebView2 это на мой взгляд самый продвинутый, универсальный элемент во всей визуальной студии, который может почти всё.
Тут сразу нужно отметить что для его использования в своих проектах по мимо знаний vb.net потребуются знания html, css и javascrpt. Так же нужно уметь правильно его инициализировать и настроить.

Как я написал выше WebView2 универсальный элемент и подойдет как для показа html документов из интернета так и локальных и даже написанных на лету и добавит вашему проекту больше возможностей, а возможностей у любого браузера как известно нимало.


1. Создайте новое Приложение Windows Forms (Майкрософт) Название проекта придумайте сами, укажите платформу ...я использую .Net 8.0

2. В верхнем меню нажмите на Проект и выберите вкладку Управление пакетами NuGet...

3. В открывшемся окне забейте в окно поиска пакетов Microsoft.Web.WebView2, после того как пакет будет найден нажмите на него и добавьте его в свой проект. Как только пакет будет добавлен, можете смело закрыть это окно, сюда мы больше не вернёмся.

4. Откройте панель элементов и добавите на окно WebView2 элемент (его размеры на данном этапе роли никакой не играют)

5. Перейдите к коду окна и отредактируйте событие Form1_Load так

VB.NET
1
2
3
    Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
 
    End Sub
6. созидайте поле App и присвойте ему значение = My.Application.Info.ProductName

код в вашем окне на данном этапе должен выглядеть так (думаю не трудно догадаться что делает Function Initialization() поэтому не стану описывать)

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
Imports Microsoft.Web.WebView2.Core
Imports System.IO
 
Public Class Form1
    Public ReadOnly App = My.Application.Info.ProductName
    Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Await Initialization()
    End Sub
    Private Async Function Initialization() As Task
        Dim e = Await CoreWebView2Environment.CreateAsync(Nothing, Path.Combine(Path.GetTempPath(), App), Nothing)
        Await WebView21.EnsureCoreWebView2Async(e)
    End Function
End Class
7. Теперь приступим к настройке WebView2 элемента. Что бы не выскочила ошибка нам нужно дождаться завершения процесса инициализации. Отловить это событие можно так...

VB.NET
1
2
3
    Private Sub WebView21_CoreWebView2InitializationCompleted(sender As Object, e As CoreWebView2InitializationCompletedEventArgs) Handles WebView21.CoreWebView2InitializationCompleted
 
    End Sub
8. В верхнем меню Проект выберите пункт Создать папку и назовите её source. Папка должна появиться в Обозревателе решений. Наведите на эту папку курсор и нажмите правую кнопку мыши. В открытом меню выберите добавить и существующий элемент. Выберете любой mp3 файл ...на ваше усмотрение. После того как файл был добавлен. Выберите курсором этот файл и его свойствах ..копировать в выходной каталог выбираете копировать более позднею версию.

'Теперь мы готовы к первому старту. Код выглядит так

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
Imports Microsoft.Web.WebView2.Core
Imports System.IO
 
Public Class Form1
    Public ReadOnly App = My.Application.Info.ProductName
    Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Await Initialization()
    End Sub
 
 
 
    Private Async Function Initialization() As Task
        Dim e = Await CoreWebView2Environment.CreateAsync(Nothing, Path.Combine(Path.GetTempPath(), App), Nothing)
        Await WebView21.EnsureCoreWebView2Async(e)
    End Function
 
    Private Sub WebView21_CoreWebView2InitializationCompleted(sender As Object, e As CoreWebView2InitializationCompletedEventArgs) Handles WebView21.CoreWebView2InitializationCompleted
        If e.IsSuccess Then
'тут первая настройка  создаём  виртуальный хост             
sender.CoreWebView2.SetVirtualHostNameToFolderMapping(App, "source", CoreWebView2HostResourceAccessKind.Allow)
 
         sender.NavigateToString("<h3>Привет лунатикам</h3>")
        End If
    End Sub
End Class
Позже расскажу как отключить контекстное меню у WebView2 элемента, зачем нужен виртуальный хост, как отловить разные события элемента и как заcтавить WebView2 играть музыку.




Ну Вот и настало позже... Если вы сделали все правильно, То при первом старте программы вы должны увидеть в окне WebView2 элемента Привет лунатикам... и мы продолжаем

Откройте любой текстовый редактор, скопируйте туда ниже приведенный код и сохраните документ к примеру как document.htm и добавите его в ресурсы программы. Он должен быть доступен вот по этому адресу My.Resources.document

HTML5
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
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
 
</head>
 
<body>
 
    <h3>Привет лунатикам</h3>
    <audio controls id="myAudio" preload="auto" loop="loop" hidden>
        <source src="##VirtualHost##salyut.mp3" type="audio/mpeg">
    </audio>
 
    <script type="text/javascript">
 
        document.addEventListener('keydown', key_down);
        document.addEventListener('mousedown', mouse_down);
 
        function key_down() {
            document.removeEventListener('keydown', key_down);
            window.chrome.webview.postMessage("keydown");
        }
        function mouse_down() {
            document.removeEventListener('mousedown', mouse_down);
            window.chrome.webview.postMessage("mousedown");
        }
 
        function AutoRun() {
            document.getElementById('myAudio').play();
        }
    </script>
 
</body>
</html>
VB имеет возможность запускать функции javascript(a), тут есть правда один нюанс... что бы всё работало как нужно...нужно дождаться полной загрузки html документа в WebView2 элемент

поймать это событие и запустить функцию можно вот так

VB.NET
1
2
3
4
5
    Private Sub WebView21_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Handles WebView21.NavigationCompleted
        If e.IsSuccess Then
            sender.ExecuteScriptAsync("AutoRun()")
        End If
    End Sub
Зачем был нужен виртуальный хост?

Поскольку нашего html документа как бы не существует и его местоположение неизвестно, короткие ссылки на ресурсы из html типа такой
HTML5
1
<source src="./salyut.mp3" type="audio/mpeg">
работать не будут
Все ресурсы в папке source будут доступны по адресу "https://WinFormsApp1/" или ровны значению поля VirtualHost

HTML5
1
<source src="https://WinFormsApp1/salyut.mp3" type="audio/mpeg">
Как поймать события внутри WebView2 элемента?

Тут тоже всё очень просто... при помощи javascript(a) и перенаправить в VB через postMessage

Поймать в VB и обработать можно таким образом...

VB.NET
1
2
3
4
5
6
7
8
9
10
    Private Sub WebView21_WebMessageReceived(sender As Object, e As CoreWebView2WebMessageReceivedEventArgs) Handles WebView21.WebMessageReceived
        Dim js = e.TryGetWebMessageAsString()
        Select Case True
            Case js = "mousedown"
                MsgBox("Была нажата кнопка мыши")
            Case js = "keydown"
                MsgBox("Была нажата клавиша клавиатуры")
 
        End Select
    End Sub

а это весь код

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Imports Microsoft.Web.WebView2.Core
Imports System.IO
 
Public Class Form1
   Public  ReadOnly App = My.Application.Info.ProductName.ToLower
    Public  ReadOnly VirtualHost As String = "https://" + App + "/"
    Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        WebView21.Bounds = DisplayRectangle
        Await Initialization()
    End Sub
 
 
 
    Private Async Function Initialization() As Task
        Dim e = Await CoreWebView2Environment.CreateAsync(Nothing, Path.Combine(Path.GetTempPath(), App), Nothing)
        Await WebView21.EnsureCoreWebView2Async(e)
    End Function
 
    Private Sub WebView21_CoreWebView2InitializationCompleted(sender As Object, e As CoreWebView2InitializationCompletedEventArgs) Handles WebView21.CoreWebView2InitializationCompleted
        If e.IsSuccess Then
 
            sender.CoreWebView2.SetVirtualHostNameToFolderMapping(App, "source", CoreWebView2HostResourceAccessKind.Allow)
            sender.CoreWebView2.Settings.AreBrowserAcceleratorKeysEnabled = False ' отключаем горячие клавиши
            sender.CoreWebView2.Settings.AreDefaultContextMenusEnabled = False ' отключаем Контекст Меню
 
 
 
 
            sender.NavigateToString(My.Resources.document.Replace("##VirtualHost##", VirtualHost))
        End If
    End Sub
    Private Sub WebView21_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Handles WebView21.NavigationCompleted
        If e.IsSuccess Then
            sender.ExecuteScriptAsync("AutoRun()")
        End If
    End Sub
 
 
 
    Private Sub WebView21_WebMessageReceived(sender As Object, e As CoreWebView2WebMessageReceivedEventArgs) Handles WebView21.WebMessageReceived
        Dim js = e.TryGetWebMessageAsString()
        Select Case True
            Case js = "mousedown"
                MsgBox("Была нажата кнопка мыши")
            Case js = "keydown"
                MsgBox("Была нажата клавиша клавиатуры")
 
        End Select
    End Sub
End Class
всё !!!
Миниатюры
Нажмите на изображение для увеличения
Название: #1.jpg
Просмотров: 8513
Размер:	167.2 Кб
ID:	8931   Нажмите на изображение для увеличения
Название: #2.jpg
Просмотров: 7410
Размер:	165.5 Кб
ID:	8932   Нажмите на изображение для увеличения
Название: #3.jpg
Просмотров: 7217
Размер:	81.6 Кб
ID:	8934  

Нажмите на изображение для увеличения
Название: #4.jpg
Просмотров: 7990
Размер:	165.2 Кб
ID:	8935   Нажмите на изображение для увеличения
Название: #5.jpg
Просмотров: 7471
Размер:	95.1 Кб
ID:	8936  
Метки .net, vb.net
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Сия эпистола зело информативна и полезна...Visual Basic 6 моя первая большая любовь...даже книжка сохранилась
    кстати семейство бейсиков зря игнорируется начинающими программистами...это очень хороший инструмент на
    все случаи жизни...а на SmallBasic 1.2 c расширениями можно писать даже 3D игры

    Автору респект и пожелание всячески просвещать общественность!!!
    Запись от avedeo размещена 16.03.2025 в 13:56 avedeo вне форума
 
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru