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 |
|
всё !!!
|