GeckoFX

  • VB.NET

Es gibt 41 Antworten in diesem Thema. Der letzte Beitrag () ist von Acr0most.

    Hallo ihr lieben,

    ich bin gerade an einem GeckoWebBrowser programmieren und bis jetzt hatte ich auch keine Probleme aber nun stoße ich an meine Grenzen und zwar: wenn ich jetzt mein Programm starte bzw. auf die Website skype.de/ gehe und dann dort auf Downloads gehe sowie dann auf den Button Download starten, kommt kein Downloader. Ich habe bereits hier im Forum gesehen, dass ich dazu auch noch eine Datei und dann ein benötigen Code brauche. Könnt ihr mir diese Datei und den nötigen Code schicken?

    MFG

    Thiemo1991 schrieb:

    Könnt ihr mir diese Datei und den nötigen Code schicken?

    Sorry, dies ist eine Community wo sich Leute gegenseitig Helfen. Wir unterstützden dich gerne dabei die Lösung zu finden, willst du einfach das jemand deine Arbeit macht stelle dies bitte in den Marktplatz und gebe alle angaben gemäß den dortigen regeln an. wie z.b. was du bereit bist dafür zu zahlen.
    Ich denke nicht das dir hier jemand für lau einfach so deine Arbeit macht. :whistling:

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    Ich mach mir schon dann die Arbeit (auch mit einem schriftlichen Tutorial) aber ich finde darüber im Internet eigentlich gar nichts.
    Ich habe das bei der Suche nicht in Google gefunden deshalb habe ich auch hier nachgefragt.

    Muss ich diesen Code in das SaveFileDialog:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim myStream As Stream
    2. Dim saveFileDialog1 As SaveFileDialog = New SaveFileDialog()
    3. saveFileDialog1.Filter = "All files (*.*)|*.*"
    4. saveFileDialog1.FilterIndex = 2
    5. saveFileDialog1.RestoreDirectory = True
    6. saveFileDialog1.FileName = e.Filename
    7. If saveFileDialog1.ShowDialog() = DialogResult.OK Then
    8. If(__InlineAssignHelper(myStream, saveFileDialog1.OpenFile())) IsNot Nothing Then
    9. Dim source As nsIURI = IOService.CreateNsIUri(e.Url)
    10. Dim dest As nsIURI = IOService.CreateNsIUri(New Uri(saveFileDialog1.FileName).AbsoluteUri)
    11. Dim t As nsAStringBase = CType(New nsAString(System.IO.Path.GetFileName(saveFileDialog1.FileName)), nsAStringBase)
    12. Dim persist As nsIWebBrowserPersist = Xpcom.CreateInstance(Of nsIWebBrowserPersist)("@mozilla.org/embedding/browser/nsWebBrowserPersist;1")
    13. Dim DownloadMan As nsIDownloadManager = Nothing
    14. DownloadMan = Xpcom.CreateInstance(Of nsIDownloadManager)("@mozilla.org/download-manager;1")
    15. Dim download As nsIDownload = DownloadMan.AddDownload(0, source, dest, t, e.Mime, 0, Nothing, CType(persist, nsICancelable), False)
    16. If download IsNot Nothing Then
    17. persist.SetPersistFlagsAttribute(2 Or 32 Or 16384)
    18. persist.SetProgressListenerAttribute(CType(download, nsIWebProgressListener))
    19. persist.SaveURI(source, Nothing, Nothing, Nothing, Nothing, CType(dest, nsISupports), Nothing)
    20. End If
    21. myStream.Close()
    22. End If
    23. End If
    24. End Sub


    oder in das Form-Load einfügen?
    (Ich habe diesen Code mit einem Online Konverter übersetzen lassen da ich es nicht alleine übersetzen kann.)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thiemo1991“ ()

    Thiemo1991 schrieb:

    Ich mach mir schon dann die Arbeit (auch mit einem schriftlichen Tutorial)

    Sorry, aber wie willst du ein Tut von etwas machen, von dem du keine Ahnung hast. Ich kann auch nicht kurz mal durchlesen wie eine Herzklappe funktioniert und dann auf der Uni einen vortrag halten.

    Grob gilt, wenn du nicht mindestens Doppelt so viel über ein thema Kannst als du versuchst du lehren, vergiss es gleich wieder. Es kommen Fragen welche du nicht beantworten kannst.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    @Nofear23m, du hast mich missverstanden. Ich habe damit

    Nofear23m schrieb:

    Ich mach mir schon dann die Arbeit (auch mit einem schriftlichen Tutorial)
    nur gemeint dass ich mir wenn es darüber Tutorials gäbe, die Arbeit machen würde.
    Ich habe gehört, dass man eine Datei namens all.js braucht um den Downloader von Firefox in seinem eigenen Webbrowser nutzen zu können. Stimmt das und wo bekommt man diese her oder kann ich die im Ordner vom Firefox selber herausfinden?

    Mit der Gecko Engine downloaden

    Hallo ihr lieben,

    Wie kann mit der Gecko Engine downloaden (ich wäre froh, wenn ihr mir es erklären könnt, weil ich suche nämlich svchon länger im Internet danach- konnte aber nichts finden)?

    MFG

    Neuen Thread in vorhandenen (diesen) verschoben. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Mit einem GeckoFx-Dialog, ist aber nicht praktikabel.

    Hi.

    Mein erster Post.

    Wenn Du die Downloadlinks ermitteln kannst, solltest Du lieber einen HTTP-Client als "Downloader" bemühen.

    Ich hatte mit der GeckoFX ziemliche schwierigkeiten, vorallem mit der Nutzung von Browser-Dialogen.

    Ich habe dann die Dialoge ausgelassen und nur Daten aus dem Document in der DocumentCompleted Ereignis-Methode gesammelt, diese dann mit einem HTTP-Client verarbeitet.

    Document (Die Webseite abgebildet in der Klasse)
    OnLoaded (Nagel mich nicht fest auf den Namen des Ereignisses 'Da wo die Seite habe Fertig.')

    Edit: OnLoaded => DocumentCompleted

    Also eigentlich "Webscraping" der Seite und alle Downloadlinks (href=???) in einer Asynchronen Methode verarbeiten.
    Ist viel besser als die GeckoFx zu nutzen.

    GeckoFx nutze ich nur als "Anzeige einer gerenderten" Webseite, ansonsten HTTP-Client.
    Ist leider Doppelter aufwand, aber die JavaScript und Web 2.0 Teile sind für einen Downloadlink uninteressant.

    Hoffe konnte etwas anregen.

    c.u. Joshi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Joshi“ ()

    Ich habe schon es eingebaut aber musste es dann wieder löschen, weil es überhaupt gar nicht funktioniert hat. Wie kann ich den GeckoWebbrowser anweisen (wenn man auf einen Download Link klick) auch der Download begrinnt? Ich habe zwar schon zwei Code ausprobiert aber, wenn ich den einbaue und dann auf einen Download klicke, passiert nichts (nicht mal eine Fehlermeldung).

    Das ist der Code, den ich als erstes probiert habe.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DownloadButton.Click
    3. Dim req As System.Net.WebRequest
    4. Dim resp As System.Net.WebResponse
    5. req = Net.WebRequest.Create(FileURLtxtbox.Text)
    6. resp = req.GetResponse
    7. req.Method = Net.WebRequestMethods.Http.Get
    8. download_size = resp.ContentLength
    9. Fileprogressbar.Maximum = download_size
    10. Download.RunWorkerAsync()
    11. Progress.Start()
    12. End Sub
    13. Dim download_size As Long
    14. Dim downloaded_size As Long
    15. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles Download.DoWork
    16. My.Computer.Network.DownloadFile(FileURLtxtbox.Text, SaveFiletxtbox.Text, "", "", False, 360000, True)
    17. End Sub
    18. Private Sub Progress_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Progress.Tick
    19. downloaded_size = My.Computer.FileSystem.GetFileInfo(SaveFiletxtbox.Text).Length
    20. Fileprogressbar.Value = downloaded_size
    21. End Sub
    22. End Class


    Und das von einem Freund ein Code der auch nicht funktioniert.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net
    2. Public Class Form1
    3. Private Sub btn_start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_start.Click
    4. Dim wc As New WebClient
    5. AddHandler wc.DownloadProgressChanged, AddressOf DownloadProgressChanged
    6. AddHandler wc.DownloadFileCompleted, AddressOf DownloadFileCompleted
    7. wc.DownloadFileAsync(New System.Uri("http://myserver.tv/tmPlayer.exe"), My.Application.Info.DirectoryPath & "/tmPlayer.exe")
    8. End Sub
    9. Public Sub DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
    10. progress_download.Value = e.ProgressPercentage
    11. lbl_Info.Text = e.BytesReceived & "/" & e.TotalBytesToReceive
    12. End Sub
    13. Public Sub DownloadFileCompleted(ByVal sender As Object, ByVal e As EventArgs)
    14. progress_download.Value = 0
    15. lbl_Info.Text = "Download fertig"
    16. MessageBox.Show("Download fertig!", "Downloader", MessageBoxButtons.OK)
    17. End Sub
    18. End Class


    (Ich habe vergessen zu erwähnen, dass ich den Downloader NICHT als zwete Form sondern in der eigentlichen Form des Webbrowsers haben möchte.)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thiemo1991“ ()

    Strategie für Ereignisbehandlung in GeckoFX

    Hallo nochmal.

    Ich musste echtmal tief graben im Datenmüll um das Projekt mit dem GeckoFX Steuerelement zu finden.

    Nichtsdestotrotz hast Du mich auf was nettes gestoßen, danke...

    Genug Geplänkel, zurück zum Thema.

    Ich nehme mal hier an, dass Du ein WPF-Projekt vorliegen hast.

    Meine Strategie den GeckoFX zu behandeln, ist:

    Ersteinmal den Browser mit WithEvents instanzieren oder in XAML einfügen (dann macht er das auch).

    VB.NET-Quellcode

    1. Public WithEvents Geckoweb As GeckoWebBrowser

    oder im XAML Editor.

    XML-Quellcode

    1. <gecko:GeckoWebBrowser x:Name="GeckoWeb" />


    Somit kann im Visual Studio Code Editor oben das GeckoFX ausgewählt werden, und er zeigt dir die Events (Ereignisse) an.

    Zwei der wichtigen sind DocumentCompleted und in deinem Fall DomClick.

    "Info: Die Instanz hat hier den Namen 'GeckoWeb'."

    Also hier alles mögliche tun wenn die Webseite in den Browser (vollständig) geladen wurde.

    VB.NET-Quellcode

    1. Private Sub GeckoWeb_DocumentCompleted(sender As Object, e As GeckoDocumentCompletedEventArgs) Handles GeckoWeb.DocumentCompleted
    2. 'Was soll mit der gerenderten Webseite gemacht werden?
    3. 'Hier evtl. Elemente sammeln und ab arbeiten. Kreativ sein...
    4. 'Erklärungen folgen später...
    5. End Sub


    In diesem Ereignis-Handler vom Typ DomClick wird dann auf einen Click innerhalb des Webseite reagiert.

    VB.NET-Quellcode

    1. Private Sub GeckoWeb_DomClick(sender As Object, e As Gecko.DomMouseEventArgs) Handles GeckoWeb.DomClick
    2. Dim element As GeckoHtmlElement = e.Target.CastToGeckoElement()
    3. If element.TagName = "IMG" Then 'Ist es ein Bild?
    4. e.Handled = True 'hier wird das Ereignis abgefangen und damit wird nicht zum SRC navigiert.
    5. Debug.WriteLine("Aus dem IMG Bereich:")
    6. Debug.WriteLine(element.OuterHtml)
    7. Debug.WriteLine("")
    8. Debug.WriteLine(element.Attributes.Item("SRC").NodeValue)
    9. Debug.WriteLine("")
    10. 'Hier den SRC Wert an den HTTP-Client übergeben und weitermachen mit der Downloadverwaltung
    11. End If
    12. If element.TagName = "A" Then 'ist es ein Weblink? (In freier Natur häufig in blau und unterstrichen anzufinden.)
    13. e.Handled = True 'hier wird das Ereignis abgefangen und damit wird nicht zum HREF navigiert.
    14. Debug.WriteLine("Aus dem A Bereich:")
    15. Debug.WriteLine("http://" & GeckoWeb.Document.Domain & element.Attributes.Item("HREF").NodeValue)
    16. Debug.WriteLine("")
    17. Debug.WriteLine(element.Attributes.Item("HREF").NodeValue)
    18. Debug.WriteLine("")
    19. 'Hier den HREF Wert an den HTTP-Client übergeben und weitermachen mit der Downloadverwaltung
    20. End If
    21. End Sub


    Dim element As GeckoHtmlElement = e.Target.CastToGeckoElement()

    Eine gute Idee ist es in GeckoFX die Objekte zu nutzen und sie in Variablen abzulegen.
    Hier wird eine Casting zur verfügung gestellt. Tolle Sache das!

    If element.TagName = "IMG" und If element.TagName = "A"

    Und zwei Tag-Typen "IMG" und "A" kommen in Frage.
    Was bei einem Javascriptlink zu machen ist, sollte nicht zu schwer sein, aber ich lasse das mal an dieser Stelle weg.

    Somit sollte deine Anforderung, auf Klickereignisse im GeckoFX Steuerelement, erfüllt sein.

    Wichtig zu verstehen ist, das deine/eure Versuche nicht auf den "Inhalt" der Webseite reagiert haben, sondern nur auf das Steuerelement, dem GeckoFX.Webbrowser.
    Daher der Zugriff an die Objekte im DOM.
    SelfHTML ist da eine gute Lektüre, falls Fragen zum DOM-Object etc. aufkommen.

    Jetzt zum Ereignis DocumentCompleted.

    Hier ist für mich die Zentrale-Feuerleitstelle!

    In diesem Ereignis behandelt man das vollständige Laden der Webseite in den Browser.

    Einfach gesagt: "Biste fertig?" "Ja? Dann..."

    Hier können die Elemente ermittelt und gesammelt werden.

    Beispiel "Alle Bilder mit Verlinkungen":

    VB.NET-Quellcode

    1. Private Sub GeckoWeb_DocumentCompleted(sender As Object, e As GeckoDocumentCompletedEventArgs) _
    2. Handles GeckoWeb.DocumentCompleted
    3. Do While GeckoWeb.IsBusy = True AndAlso GeckoWeb.IsAjaxBusy = True
    4. Thread.Sleep(500)
    5. Loop
    6. GeckoWeb.Focus()
    7. If GeckoWeb.Document IsNot Nothing Then
    8. Dim bilderListeMitLinks As List(Of GeckoHtmlElement) = _
    9. GeckoWeb.Document.GetElementsByTagName("IMG").Where(Function(x) x.ParentElement.TagName <> "A").ToList()
    10. For Each img In bilderListeMitLinks
    11. Debug.WriteLine(img.GetAttribute("SRC").ToString())
    12. Next
    13. End If
    14. End Sub



    Kleiner Workaround für Timing-Probleme:

    VB.NET-Quellcode

    1. Do While GeckoWeb.IsBusy = True AndAlso GeckoWeb.IsAjaxBusy = True 'Bitte als erstes im Ereignis "DocumentCompleted" einpflegen.
    2. Thread.Sleep(500) 'ein bischen Zeit verstreichen lassen
    3. Loop
    4. GeckoWeb.Focus() 'Wichtig um Eingaben zu simulieren.



    Dann sollte immer auf ein "Nothing" des "Document" geprüft werden, und nur dann mit der Webseite arbeiten.

    Beispiele für Eingaben:

    VB.NET-Quellcode

    1. Dim eingabeElement As GeckoInputElement = DirectCast(GeckoWeb.Document.GetElementById("searchInput"), GeckoInputElement)
    2. eingabeElement.ScrollIntoView(True)
    3. eingabeElement.Focus()
    4. eingabeElement.Click()
    5. eingabeElement.Value = "Ich bin ein Text."
    6. eingabeElement.SelectionStart = 0
    7. eingabeElement.SelectionEnd = eingabeElement.Value.Length
    8. Dim submit As Gecko.DOM.GeckoButtonElement = GeckoWeb.Document.GetElementById("submit")
    9. submit.Click()



    Die Methode ist immer ähnlich aufgebaut.
    1. Auswahl des Elements oder mehrerer Elemente.
    2. Dann in das entsprechende Gecko-Element "Casten" umwandeln.
    3. Auf das Element die Aktionen/Auswertungen ausführen.
    4. Reich wie Bill Gates werden... (In welchem NuGet-Paket ist das denn? )


    Ein Beispiel mit komplizierter Element Auswahl:

    Hole das Element "mw-imagepage-nofile", dann alle Absätze, davon den ersten und schau ob der Wert des Textinhaltes (TextContent) den Text "Es existriert..." enthält, und abschließend navigiere zur Webseite.
    Anmerkung: Ich habe folgendes in einem Bildupload Programm verwendet, und es in realen Bedingungen genutzt. (WikiMedia upload über Parameterübergabe.)

    VB.NET-Quellcode

    1. If GeckoWeb.Document.GetElementById("mw-imagepage-nofile").GetElementsByTagName("P").Item(0).TextContent.Contains("Es existiert keine Datei mit diesem Namen, aber du kannst diese Datei hochladen.") Then
    2. GeckoWeb.Navigate("http://de.platzhalter.wikia.com/wiki/Spezial:Hochladen?wpDestFile=" & tempgegenstand.IconName.Replace(" ", " ") & "&wpLicense=Bildzitat" & "&wpUploadDescription=Mit freundlicher Genehmigung von Platzhalter." & "&wpUploadFile=" & tempgegenstand.IconZielPfad.Replace(" ", " "))
    3. End If



    Ein Auszug aus dem HTTP-Client mit Async:


    VB.NET-Quellcode

    1. Public Async Function GetImages(url As String) As Task(Of List(Of WikiaImage))
    2. Dim client As New HttpClient()
    3. Dim result As String = Await client.GetStringAsync(url)
    4. Dim xdoc = XDocument.Parse(result)
    5. client.Dispose()
    6. 'Debug.WriteLine(xdoc.Root)
    7. 'check if more to come
    8. Dim querycontinue As IEnumerable(Of XElement) =
    9. From el In xdoc...<query-continue>
    10. Select el
    11. For Each el As XElement In querycontinue
    12. _nextPagination = el.Element("allimages").Attribute("aifrom").Value
    13. 'Debug.WriteLine("_nextPagination: " & _nextPagination)
    14. Next
    15. If querycontinue.Count = 0 Then
    16. _paginationStatus = True 'set to True to stop pagination
    17. GetImagesFromWiki()
    18. 'Debug.WriteLine("nothing there")
    19. Else
    20. If _nextPagination <> "" Then
    21. GetImagesFromWiki()
    22. End If
    23. End If
    24. Return (From image In xdoc.Descendants("allimages").Elements("img") Where
    25. (image.Attribute("mime").Value = "image/jpeg" Or image.Attribute("mime").Value = "image/png" Or
    26. image.Attribute("mime").Value = "image/gif")
    27. Select
    28. New WikiaImage() _
    29. With {.Title = image.Attribute("title").Value,
    30. .Name = image.Attribute("name").Value, .Url = image.Attribute("url").Value,
    31. .DescriptionUrl = image.Attribute("descriptionurl").Value,
    32. .Comment = image.Attribute("comment").Value,
    33. .ParsedComment = image.Attribute("parsedcomment").Value,
    34. .Height = image.Attribute("height").Value, .Width = image.Attribute("width").Value,
    35. .Size = image.Attribute("size").Value, .User = image.Attribute("user").Value,
    36. .UserId = image.Attribute("userid").Value}).ToList().GroupBy(Function(x) x.Name).[Select](
    37. Function(g) g.First()).ToList()
    38. End Function
    39. Public Class WikiaImage
    40. Private _sizeString As String
    41. Public Property Name As String
    42. Public Property User As String
    43. Public Property UserId As String
    44. Public Property Comment As String
    45. Public Property ParsedComment As String
    46. Public Property Size As Long 'the Value of the Byte Size in the XML Quiery
    47. Public ReadOnly Property SizeString As String
    48. Get
    49. Return ByteSizeLib.ByteSize.FromBytes(Size).ToString() 'to display in WPF Element
    50. End Get
    51. End Property
    52. Public ReadOnly Property SizeValue As String
    53. Get
    54. Return ByteSizeLib.ByteSize.FromBytes(Size).LargestWholeNumberValue.ToString("#.##") 'for the Filter
    55. End Get
    56. End Property
    57. Public Property Width As Integer
    58. Public Property Height As Integer
    59. Public Property Url As String
    60. Public Property DescriptionUrl As String
    61. Public Property Link As String
    62. Public Property Title As String
    63. Public Property CachedFilePath As String
    64. <System.Xml.Serialization.XmlAttribute>
    65. Public Property IsCached As Boolean
    66. <System.Xml.Serialization.XmlAttribute>
    67. Public Property Hide As Boolean
    68. End Class


    Anmerkung: Ich habe nur die Klasse und die Funktion hier eingepflegt, dazu gehört einiges mehr, ist nicht Funktional!


    Der HTTP-Client (hier ein Web-Client) kann auch den Verlauf zurückmelden, wenn dazu ein Ereignis-Handler angegeben wird.
    Also kann das Progressbar angekoppelt werden.

    VB.NET-Quellcode

    1. Sub DownloadItem()
    2. If _items.Any() Then
    3. Dim nextItem = _items.Dequeue()
    4. Dim webClient = New WebClient()
    5. AddHandler webClient.DownloadFileCompleted, AddressOf OnGetDownloadedFileCompleted
    6. AddHandler webClient.DownloadProgressChanged, AddressOf DownloadProgressCallback
    7. webClient.DownloadFileAsync(New Uri(nextItem.Url), ImagesCacheFolderPath & "\" & nextItem.Name,
    8. nextItem.Name)
    9. Return
    10. Else
    11. 'RaiseEvent OnWikiaImagesChanges("Nothing to be Cached.")
    12. IsBusy = False
    13. End If
    14. 'Process Result Strings ??
    15. End Sub
    16. Private Sub DownloadProgressCallback(sender As Object, e As DownloadProgressChangedEventArgs)
    17. 'If e.BytesReceived < e.TotalBytesToReceive
    18. ' RaiseEvent OnWikiaImagesChanges("Download in Progress.")
    19. 'End If
    20. StatusString = "WikiaImagesProgress: " & e.UserState.ToString() & ";" & e.ProgressPercentage.ToString()
    21. If e.ProgressPercentage = 100 Then
    22. If _items.Count = 0 Then
    23. IsBusy = False
    24. End If
    25. End If
    26. If _items.Count = 0 Then
    27. RaiseEvent OnWikiaImagesChanges("Downloading into Cache is done. " & ImagesList.Count)
    28. End If
    29. End Sub
    30. Public Shared Event OnWikiaImagesChanges As WikiaImagesEvent
    31. Public Delegate Sub WikiaImagesEvent(message As String)






    Bevor fragen wegen eines WPF/UWP-Projektes kommen, und die kommen bestimmt...

    Das GeckoFX hole ich über NuGet ins Projekt. Es kann nur in einem WindowsFormsHost genutzt werden.
    Ich habe es nicht vernünftig MVVMisiert bekommen, also ist es im Codebehind verarbeitet und nicht im ViewModel.
    Weil ich es nicht einfach mal hinbekommen habe den Formshost und darin dann das GeckoFX und dann noch die Webseite abzubilden.
    Geht halt auch so... :/
    Dazu noch Verweise zu WindowsFormsIntegration und System.Windows.Forms anlegen.




    Hier eine WPF XAML Anwendung:

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:GeckoFXTester"
    7. xmlns:gecko="clr-namespace:Gecko;assembly=Geckofx-Winforms"
    8. mc:Ignorable="d"
    9. Title="MainWindow" Height="350" Width="525"
    10. WindowState="Maximized">
    11. <Grid>
    12. <WindowsFormsHost>
    13. <WindowsFormsHost.Background>
    14. <LinearGradientBrush EndPoint="0.5,1"
    15. StartPoint="0.5,0">
    16. <GradientStop Color="Black"
    17. Offset="0" />
    18. <GradientStop Color="White"
    19. Offset="1" />
    20. </LinearGradientBrush>
    21. </WindowsFormsHost.Background>
    22. <gecko:GeckoWebBrowser x:Name="GeckoWeb"
    23. Dock="Fill" />
    24. </WindowsFormsHost>
    25. </Grid>
    26. </Window>


    Das Code-Behind dazu:

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Imports Gecko
    3. Imports Gecko.DOM
    4. Imports Gecko.Events
    5. Class MainWindow
    6. Public Sub New()
    7. ' Dieser Aufruf ist für den Designer erforderlich.
    8. InitializeComponent()
    9. ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    10. 'http://de.creativerse.wikia.com/wiki/Blumentopf
    11. ' Gecko.Xpcom.Initialize("Firefox")
    12. GeckoWeb.Navigate("http://de.creativerse.wikia.com/wiki/Diamant")
    13. End Sub
    14. Private Sub GeckoWeb_DocumentCompleted(sender As Object, e As GeckoDocumentCompletedEventArgs) _
    15. Handles GeckoWeb.DocumentCompleted
    16. Do While GeckoWeb.IsBusy = True AndAlso GeckoWeb.IsAjaxBusy = True
    17. Thread.Sleep(500)
    18. Loop
    19. GeckoWeb.Focus()
    20. If GeckoWeb.Document IsNot Nothing Then
    21. Dim eingabeElement As GeckoInputElement = DirectCast(GeckoWeb.Document.GetElementById("searchInput"), GeckoInputElement)
    22. eingabeElement.ScrollIntoView(True)
    23. eingabeElement.Focus()
    24. eingabeElement.Click()
    25. eingabeElement.Value = "Ich bin ein Text."
    26. eingabeElement.SelectionEnd = eingabeElement.Value.Length
    27. eingabeElement.SelectionStart = 0
    28. Dim submit As Gecko.DOM.GeckoButtonElement = GeckoWeb.Document.GetElementById("submit")
    29. submit.Click()
    30. Dim bilderListeMitLinks As List(Of GeckoHtmlElement) =
    31. GeckoWeb.Document.GetElementsByTagName("IMG").Where(
    32. Function(x) x.ParentElement.TagName <> "A").ToList()
    33. For Each img In bilderListeMitLinks
    34. Debug.WriteLine(img.GetAttribute("SRC").ToString())
    35. Next
    36. End If
    37. End Sub
    38. Private Sub GeckoWeb_DomClick(sender As Object, e As Gecko.DomMouseEventArgs) Handles GeckoWeb.DomClick
    39. Dim element As GeckoHtmlElement = e.Target.CastToGeckoElement()
    40. If element.TagName = "IMG" Then 'Ist es ein Bild?
    41. e.Handled = True 'hier wird das Ereignis abgefangen und damit wird nicht zum SRC navigiert.
    42. Debug.WriteLine("Aus dem IMG Bereich:")
    43. Debug.WriteLine(element.OuterHtml)
    44. Debug.WriteLine("")
    45. Debug.WriteLine(element.Attributes.Item("SRC").NodeValue)
    46. Debug.WriteLine("")
    47. 'Hier den SRC Wert an den HTTP-Client übergeben und weitermachen mit der Downloadverwaltung
    48. End If
    49. If element.TagName = "A" Then 'ist es ein Weblink? (In freier Natur häufig in blau und unterstrichen anzufinden.)
    50. e.Handled = True 'hier wird das Ereignis abgefangen und damit wird nicht zum HREF navigiert.
    51. Debug.WriteLine("Aus dem A Bereich:")
    52. Debug.WriteLine("http://" & GeckoWeb.Document.Domain & element.Attributes.Item("HREF").NodeValue)
    53. Debug.WriteLine("")
    54. Debug.WriteLine(element.Attributes.Item("HREF").NodeValue)
    55. Debug.WriteLine("")
    56. 'Hier den HREF Wert an den HTTP-Client übergeben und weitermachen mit der Downloadverwaltung
    57. End If
    58. End Sub
    59. End Class





    Noch etwas zu mehrfachen DocumentCompleted auslösungen.

    Da der GeckoFX-Browser, wenn mehrere Frames im Document enthalten sind, jedesmal das Ereignis auslöst, kann es hilfreich sein das Verhalten abzufangen/beachten.

    Eine gute hilfe dazu sind die gängigen Browser und deren Entwickler-Tools (Firefox z.B. Element untersuchen im Kontextmenü).
    Damit schnell mal die Element zu suchen, und deren Attribute in die Biofestplatte/Zwischenablage zu packen
    und dann als such Wert in GetElementById("suchwert") übergeben.

    Oder es bastelt es sich mal etwas selbst zusammen...


    MouseOver auf ein Element im GeckoFX und dann die Attribute ermitteln und ausgeben/verwerten.

    VB.NET-Quellcode

    1. Private Sub GeckoWeb_DomMouseOver(sender As Object, e As DomMouseEventArgs) Handles GeckoWeb.DomMouseOver
    2. Dim unterderMausElement As GeckoElement = DirectCast(GeckoWeb.Window.WindowUtils.ElementFromPoint(e.ClientX, e.ClientY, False, False), GeckoHtmlElement)
    3. Debug.WriteLine(unterderMausElement.TagName)
    4. For Each i In unterderMausElement.Attributes
    5. Debug.WriteLine(i.NodeName)
    6. Debug.WriteLine(i.NodeType)
    7. Next
    8. End Sub




    Das sollte, ohne auf Ajax und JavaScript eingegangen zu sein, genügend Info sein für den Einsatz von GeckoFX in WPF.

    Ich hab Ajax und Javascript nie genutzt, mir zu doof...

    Den Einsatz von Webbrowser und HTTP-Client/Webclient zusammen ist ein wenig viel wegen der Datenabfragemenge, aber gut um Bilder/Dokumente gepuffert zu Laden.
    Dialogfenster können auch abgefangen werden.
    Erfolg hatte Ich damit nur, wenn ich einen DispatcherTimer genutzt habe.
    Um alle geöffneten Fenster mithilfe von PInvokes auf vorhandensein geprüft habe.
    Nicht schwer einzubauen, aber geht mithilfe von HTTP-Client besser.

    Nochwas zur .exe-Datei in dem Beispiel von deinem Freund,
    diese sollte nicht so direkt zum Dowload angeboten werden,
    am besten vorher packen und als .zip oder sowas bereitstellen.

    So ich habe auch fertig....

    c.u. Joshi 8-)
    @Joshi, MUSS wirklich alles an dem Code, den du rein gemacht hast, für mein Vorhaben benutzen oder nur ein (gewisser) Teil?
    Es ist wirklich traurig, da gibt sich jemand wirklich Mühe, erklärt richtig schön und dann sowas. Thiemo will einfach nicht lernen, auch wenn er immer sagt er kann nur durch "Code"(btw. Copy&Paste) lernen, aber jeder der programmieren kann weiss, das man das so nicht richtig lernen kann, sagt ihm das doch auch noch mal. Zudem hat er ja Code satt bekommen, schaut auch lauffähig aus(nicht getestet) und trotzdem bekommt er es nicht hin.

    @Thiemo1991 merkst du nicht langssam auch, das du so nicht weiter kommst?

    Tuh dir selbst den gefallen und krall dir endlich mal ein gescheites Buch und bleibt da dran bis du es verstanden hast.

    Dieser Post soll nicht als bashing oder als Animation dazu verstanden werden, wollte ihm nur deutlich machen das er sich selbst mit seinen Aussagen widerspricht.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „NoIde“ ()

    Mir scheint, es muss verdammt schwer sein, zu begreifen, dass es durchaus Menschen gibt, die nicht wie andere lernen können. Timo ist nicht erst seit gestern in diesem Forum und jedem, der seine Beiträge verfolgt, müsste mittlerweile klar sein, dass Timo leider zu diesen Menschen gehört, die nicht so viel Glück wie alle anderen hatten. Es bringt nichts zu sagen, hol Dir ein Buch und lerne. Es bringt nichts zu sagen, siehst Du nicht, dass Du so nicht weiter kommst. Es ist das selbe Prinzip, als sagte man zu einem Gelähmten, steh doch auf und lauf, ist doch nicht so schwer. Er kann es nicht und das ist der Punkt.

    Das Beste, was man in Timos Fall machen kann, ist man gibt ihm die Lösung für sein Problem. Punkt. Ich finde es jedenfalls bemerkenswert, dass ein Mensch wie Timo sich überhaupt hinsetzt und zu programmieren anfängt. Ob es nun sein eigener Code ist, den er verwendet, ist doch völlig egal. Falls man mit seinen Fragestellungen nicht klar kommt oder es einen aufregt, wo ist dann das Problem, seine Beiträge einfach zu ignorieren, anstatt sich mit schlauen Sprüchen fragwürdig darzustellen?

    @Joshi Tut mir nur leid für Dich, dass Du Dir wirklich Mühe gegeben hast, aber war wohl in diesem Fall vergebens.
    @Thiemo1991 Mach einfach so weiter!
    @AlleAnderen Helft ihm und macht es für ihn so einfach wie nur möglich.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    How to turn OPTION STRICT ON
    Why OPTION STRICT ON
    @SpaceyX, danke für deinen Post, weil der mich WIRKLICH erfreut hat.

    @Joshi, deine Arbeit war nicht umsonst aber ich frage mich nur ob ich alles von dem was du an Code darein gemacht hast, auch WIRKLICH alles für mein Vorhaben brauche.
    @Thiemo1991
    Hi.

    Nur den Teil mit dem DomClick, wenn es um das "drück mich" geht.
    Wohin Du dann speicherst usw. ist nicht hier beschrieben, weil als Folge des 'Klicks', ein Download-Fenster aufgehen kann. Das programmatisch zu verwalten, ist höhere (eigentlich unterste...) Windows-Programmierung.
    Lass das mal weg, wenn es nicht anders geht, musst du diesen Weg gehen.

    Zum lösen deines Download Problems.

    In diesem Fall der "Skype Windows Installations Client"

    Es gib mehrere Möglichkeiten.

    Die erste, die ich jetzt selber nicht (ansatzweise) lösen kann, ist das mit dem "DomClick"-Ereignis.

    Ich muss mal probieren, weil ich bekomme immer diese Fehlermeldung.

    System.InvalidCastException
    HResult=0x80004002
    Nachricht = Die angegebene Umwandlung ist ungültig.
    Quelle = Geckofx-Core
    Stapelüberwachung:
    bei Gecko.nsIWebProgress.GetDOMWindowAttribute()
    bei Gecko.GeckoWebBrowser.Gecko.nsIWebProgressListener.OnStateChange(nsIWebProgress aWebProgress, nsIRequest aRequest, UInt32 aStateFlags, Int32 aStatus) in D:\temp\339b193\Geckofx-Winforms\GeckoWebBrowser.cs: Zeile1622

    Wer hier helfen könnte, bitte ich stehe frei, langer Pass...
    Weil, ich hab gar keine "D:"... Mhhhh...
    Also mein Vorschlag sollte gehen, tut er aber nicht.

    Somit habe ich mehr zur Verwirrung beigetragen, als bei der Planungssitzung angesprochen, ich der Vorstand und ich der Gewerkschaftsvertreter, waren dafür.
    :whistling:



    Gut, vielleicht dann eine ganz andere Lösung.

    Wenn es darum geht, im Programm eine Möglichkeit den Skype-Client herunterzuladen,
    dann würde ich einen Knopf mit dem Download anbieten.

    Also einen Button in deiner Programm-Oberfläche anlegen, ihm dann im Click-Ereignis den Weblicent deinse Freundes nutzen, der sah sehr gut aus.

    Dort dann als Downloadlink das hier:

    Quellcode

    1. https://go.skype.com/windows.desktop.download


    Ich werde mal den Code deines Freundes ausprobieren, und das Ergebnis in einem folgendem Post einpflegen.

    Naja, ich bin auch nur ein Primat mit Tastatur und Maus...

    Nochmal als Gegenfrage:

    Ist es verständlich gewesen, dass das GeckoFx-Webbrowser-Steuerelement Ereignisse empfangen kann und zusätzlich der Inhalt (DOM/Die Webseite) Ereignisse empfängt?

    c.u. Joshi