WebView2 : download icone

di il
2 risposte

WebView2 : download icone

Sto effettuando dei miglioramenti al mio browser: ho inserito la cronologia, i preferiti , il tooltip sulla barra dei preferiti,ecc. , ma ora sono bloccatto : non trovo nulla di “chiaro” sul come estrarre le icone dai siti.

Grazie.Ogni suggerimento sarà graditissino!

2 Risposte

  • Re: WebView2 : download icone

    Non ho capito bene la domanda, ma comunque:

    https://www.iprogrammatori.it/favicon.ico
  • Re: WebView2 : download icone

    25/11/2023 - SirJo ha scritto:


    Non ho capito bene la domanda, ma comunque:

    https://www.iprogrammatori.it/favicon.ico

    Grazie, SirJo.
    A dire il vero, intendevo qualcosa simile a System.Drawing.Icon.ExtractAssociatedIcon.
    Ho scritto il seguente codice, che certamente non è perfetto, ma mi scarica le favicon appena il download della pagina viene completato.
    Ho scritto il codice in modo che -nei limiti del possibile- risulti il più semplice possibile da interpretare, nella speranza che a qualcuno interessi e ,soprattutto, lo modifichi o mi chieda di modificarlo per un migliore funzionamento.
    Ora, non mi resta che abbinare le favicon alle listview della cronologia e dei preferiti per sostituire le immagini con le icone.

    Buona serata a tutti.

    
    Private Async Sub wv_NavigationCompleted(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs) Handles wv.NavigationCompleted
           isBusy = False
           PictureBox1.Image = My.Resources.Resource1.verde()
           'cerchiamo i titolo della pagina caricata per poter costruire la stringa della cronologia
           Dim html As String
           html = Await wv.ExecuteScriptAsync("document.documentElement.outerHTML;")
           If Not html = Nothing Then
               html = Regex.Unescape(html)
               html = html.Remove(0, 1)
               html = html.Remove(html.Length - 1, 1)
               My.Computer.FileSystem.WriteAllText(Application.StartupPath & "\html.txt", html, False)
               'ora,nel file html dobbiamo cercare due parametri : <title> e </title>
               'se sono presenti, acquisiamo la stringa compresa tra questu due tag
               'altrimenti non operiamo alcuna operazione
               Dim doc As String = My.Computer.FileSystem.ReadAllText(Application.StartupPath & "\html.txt")
               Dim indexStart As Integer = doc.IndexOf("<title>")
               Dim indexStop As Integer = doc.IndexOf("</title>")
               If indexStart >= 0 And indexStop >= 0 Then
                   titolo = doc.Substring(indexStart + 7, indexStop - (indexStart + 7))
               End If
               '<+++++++++++++++++++++++++++++++++++++++>
               '           <DOWNLOAD FILE ICO>
               '<+++++++++++++++++++++++++++++++++++++++>
               'oltre il titolo proviamo a scaricare il favicon 
               '1)leggiamo il protocollo (che potrebbe essere http o https) dall'Uri 
               Dim protocollo As String = wv.Source.AbsoluteUri.Substring(0, wv.Source.AbsoluteUri.IndexOf(":") + 3)
               2)memorizziamo il sito
              Dim dns As String = wv.Source.DnsSafeHost
               '3)cerchiamo nel file html i riferimento alla favicon
               Dim indexStartIco As Integer
               If doc.Contains("<link rel=""shortcut icon""") Then
                   indexStartIco = doc.IndexOf("<link rel=""shortcut icon""")
               ElseIf doc.Contains("<link rel=""icon""") Then
                   indexStartIco = doc.IndexOf("<link rel=""icon""")
               Else
                   GoTo continua
               End If
               4)nella stringaico memorizziamo la strinha html contenente href=
               Dim indexStopIco As Integer = doc.IndexOf(">", indexStartIco)
               If indexStart >= 0 And indexStop >= 0 Then
                   Dim stringaIco As String = doc.Substring(indexStartIco, (indexStopIco - indexStartIco) + 1)
                   stringaIco = Replace(stringaIco, """", "")
                   If Not stringaIco.Contains("http") And Not stringaIco.Contains("https") Then
                       'stringa da inserire dopo href=
                       Dim stringaDopoHref As String = protocollo & dns
                       stringaIco = stringaIco.Insert(stringaIco.IndexOf("href=") + 5, stringaDopoHref)
                   End If
                   Dim inizioStringaHref As Integer = stringaIco.IndexOf("href=") + 5
                   Dim fineStringaHref As Integer
                   If stringaIco.Contains(".ico") Then
                       fineStringaHref = stringaIco.IndexOf(".ico")
                   ElseIf stringaIco.Contains(".png") Then
                       fineStringaHref = stringaIco.IndexOf(".png")
                   ElseIf stringaIco.Contains(".jpg") Then
                       fineStringaHref = stringaIco.IndexOf(".jpg")
                   ElseIf stringaIco.Contains(".bmp") Then
                       fineStringaHref = stringaIco.IndexOf(".bmp")
                   End If
                   Dim stringaHRef As String = stringaIco.Substring(inizioStringaHref, fineStringaHref - inizioStringaHref + 4)
                   stringaHRef = Replace(stringaHRef, """", "")
                   'determiniamo ora nome ed estensione del file ico,png,ecc.
                   'per il nome andremo a trovare "favicon"
                   Dim InizioNomeFile As Integer = stringaHRef.IndexOf(LCase("favicon"))
                   Dim FineNomeFile As Integer = stringaHRef.LastIndexOf(".")
                   Dim nomeFile As String = stringaHRef.Substring(InizioNomeFile, FineNomeFile - InizioNomeFile)
                   Dim estensioneIco As String = stringaHRef.Substring(FineNomeFile, 4)
                   'ora preleviamo la favicon dal sito
                   Dim faviconsPath As String = Application.StartupPath & "\Favicons"
                   If Not Directory.Exists(faviconsPath) Then Directory.CreateDirectory(faviconsPath)
                   Dim client = New WebClient()
                   Dim remoteUri As String = stringaHRef
                   nomeFile = faviconsPath & "\" & dns & estensioneIco
                   Try
                       client.DownloadFile(remoteUri, nomeFile)
                   Catch ex As Exception
                       GoTo continua
                   End Try
               End If
           End If
    continua:
           'qui inizia la registrazione del sito per la cronologia
           'verifichiamo prima di tutto che il file esista
           Dim esiste As Boolean = My.Computer.FileSystem.FileExists(Application.StartupPath & "\cronologia.txt")
           If esiste = False Then
               GoTo Registra
               Exit Sub
           End If
           'prima di procedere verifichiamo che si tratti di un formato URI corretto
           If Not wv.Source.IsAbsoluteUri Then
               Exit Sub
           End If
    
           'prima di registrare una cronologia, verifichiamo se l'elemento da aggiungere esista già
           Dim selectedValues As New List(Of cronologia_str)
           'verifichiamo se il sito è già presente nella lista.
           selectedValues = cronologia_ls.FindAll(Function(p) p.indirizzo = wv.Source.AbsoluteUri)
           If selectedValues.Count > 0 Then    'c'è
               'preleviamo l'indice della List
               Dim indice = cronologia_ls.IndexOf(selectedValues(0))
               'cancelliamo il dato dalla List
               cronologia_ls.RemoveAt(indice)
               'aggiungiamo il sito alla lista
               Dim C As New cronologia_str
               C.data = Now.ToString
               C.sito = titolo
               C.indirizzo = wv.Source.AbsoluteUri
               If Not C.indirizzo.StartsWith("http://") And Not C.indirizzo.StartsWith("https://") Then
                   MsgBox("Errore nella registrazione della cronologia.")
                   Exit Sub
               End If
               cronologia_ls.Add(C)
           Else    'non c'è
    Registra:
               'lo aggiungiamo alla lista
               Dim C As New cronologia_str
               C.data = Now.ToString
               C.sito = titolo
               C.indirizzo = wv.Source.AbsoluteUri
               If Not C.indirizzo.StartsWith("http://") And Not C.indirizzo.StartsWith("https://") Then
                   MsgBox("Errore nella registrazione della cronologia.")
                   Exit Sub
               End If
               cronologia_ls.Add(C)
           End If
Devi accedere o registrarti per scrivere nel forum
2 risposte