Webbrowser Upload- Download-Dialog verhindern

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Digot - Software.

    Webbrowser Upload- Download-Dialog verhindern

    Hallo zusammen,

    Ich programmiere für eine öffentlich zugängliche Touch-Info-Plattform an meiner Hochschule
    einen Webbrowser. Ich arbeite hierbei mit einem Webbrowser-Element. Das Programm soll von Windows
    isoliert laufen (also kein Zugriff auf die Windows Oberfläche).
    Das Problem:
    Versucht man einen Download oder Upload zu starten oder klickt man auf einen E-Mail Link öffnet sich der Upload, Download oder E-Mail-Dialog.
    Damit kann der User auf die Festplatte des Rechners zugreifen und das Programm verlassen.

    Ich brauche dringend Hilfe. Projekt-Deadline rückt näher!

    Ansatz I über ...

    Dim p As System.Diagnostics.Process
    Dim pp As System.Diagnostics.Process()
    pp
    = System.Diagnostics.Process.GetProcesses
    For Each p In pp
    If p.MainWindowTitle = "Titel des Fensters des Downloads" Then
    p.
    Kill()
    End If
    Next

    ...will nicht?

    Und bei Ansatz II über...

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Dim ff As FormCollection
    ff = My.Application.OpenForms
    For i = My.Application.OpenForms.Count To 1 Step -1
    For Each f As Form In ff
    If f.Name <> "Hauptseite" And f.Name <> "Tastatur" And f.Name <> "Internet" And f.Name <> "InternetButton" And f.Name <> "keysbaunzen" And f.Name <> "Favourites" Then
    f.Close()
    GoTo ende
    Else
    End If
    Next
    ende:
    Next

    ... schließt er das Download-Dialogfenster nicht weil es denke ich keine "Form" ist ... kann das sein ?? Was kann ich da machen ?

    Ein dritter möglicher Ansatz...

    wäre per Sendkeys "A" den Abbrechen-Button des Dialogfensters anzusteuern. Aber selbes Problem wie immer ich bekomme den Event nicht das
    das Ding aufgetaucht ist und kann es also auch nicht ansprechen.
    Hat vielleicht da einer eine Idee ?


    Vielen Dank im Voraus,

    MyStik

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „MyStik“ ()

    Da Dir bisher niemand geantwortet hat, will ich Dir zumindest einen weiteren Ansatz geben.

    Erst einmal würde ich an Deiner Stelle die Sicherheitseinstellungen des IE genauestens durchforsten (ActiveX, Downloads) um alles zu verbieten was kritisch sein könnte. Ich gehe davon aus, dass Du das sowieso schon gemacht hast.

    Der Ansatz I über Process.Mainhandle wird nie funktionieren , da solche up-/Downloadfenster ja schliesslich keine MainWindows sind , sondern Child-Windows des IE. Besser ist es über die API EnumChildWindows zu gehen, und diese nach bestimmten Kriterien zu selektieren.

    Hier hast Du einen Code, der Dir alle sichtbaren Fenster mit Titel und Klasse im Direktfenster ausgibt, Du kannst damit ja ein bisschen experimentieren:
    Alle sichtbaren Fenster mit Titel und Klasse anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. '------------------------------------------
    3. '-- API Deklarationen ---
    4. '------------------------------------------
    5. ' API Deklarationen
    6. Public Declare Function GetDesktopWindow Lib "user32" () As IntPtr
    7. Public Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hwnd As IntPtr, ByVal lpClassName As String, ByVal nMaxCount As Integer) As Integer
    8. Public Declare Auto Function GetWindowText Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Integer) As Integer
    9. Public Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As Win32Callback, ByVal lParam As IntPtr) As IntPtr
    10. Public Declare Function IsWindowVisible Lib "user32.dll" (ByVal hWnd As IntPtr) As Boolean
    11. '------------------------------------------
    12. '-- Delegates ---
    13. '------------------------------------------
    14. Public Delegate Function Win32Callback(ByVal hwnd As IntPtr, ByVal lParam As IntPtr) As Boolean
    15. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    16. ' Der Aufruf erfolgt durch:
    17. EnumWindows(AddressOf enumWindowsProc, Nothing)
    18. End Sub
    19. ' listet alle bestehenden sichtbaren fenster auf
    20. Public Function enumWindowsProc(ByVal hWnd As IntPtr, ByVal lpParam As IntPtr) As Boolean
    21. 'Variablen
    22. Dim len As Integer
    23. Dim title As String = Space(255)
    24. Dim className As String = Space(255)
    25. 'Title wird rausgesucht
    26. len = GetWindowText(hWnd, title, 255)
    27. title = title.Substring(0, len)
    28. ' window invisible ? -> return
    29. If Not IsWindowVisible(hWnd) Then Return True
    30. ' get Title
    31. len = GetWindowText(hWnd, title, 255)
    32. title = title.Substring(0, len)
    33. ' kein Fenstertitel ? -> return
    34. If len <= 0 Then Return True
    35. ' get className
    36. len = GetClassName(hWnd, className, 255)
    37. className = className.Substring(0, len)
    38. ' format output
    39. Dim formattedOutput As String = String.Format("{0,-10} {1,-50} {2} ", hWnd, className, title)
    40. Trace.WriteLine(formattedOutput)
    41. ' next
    42. Return True
    43. End Function
    44. End Class


    Es sieht so aus, als ob diese IE Child-Windows alle eine bestimmte Klasse haben (#32770), überprüfen musst Du das bitte selber.

    Ein anderer möglicher Ansatz wäre nicht über das WebBrowser Control zu gehen sondern direkt den IE über die Library SHDocVW.DLL einzubinden, die ermöglicht evtl. mehr Events was neue Fenster angeht. Aber das wollte ich auch nicht weiter nachprüfen, es war eine lange Woche.

    Dummerweise ist der IE offen wie ein Scheunentor, so dass man vermutlich nicht alle Sicherheitslücken unter Kontrolle bekommen wird.

    Nachtrag: auch wenn es wohl möglich sein wird per Timer regelmässig die offenen Fenster zu überpüfen, so ist das doch eine ziemlich unelegante Lösung. Besser wäre es über das Öffnen eines neuen Windows per Event zu erfahren, leider scheint das per .NET nicht zu funktionieren da Low Level Hooks sehr begrenzt sind. Allerdings sollte das über eine externe Library (C,C++) durchaus funktionieren ( siehe hier ). Damit wäre die Info auch Deinem Hauptprogramm zugänglich, wenn Du in der DLL eine Callback Funktion per Delegate einrichtest.

    Gruss

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

    Vielen Dank für die ausführliche Antwort... da ich kein Profi bin sondern nur Ingenieur mit Fachrichtung Informatik 8| *<--thats me*...
    werde ich deine Tipps durchackern.

    V.a. der Ansatz über die Child Windows Hört sich vielversprechend an ...

    Sobald ich eine Möglichkeit gefunden habe werd ich mal den Code veröffentlichen. Das Problem scheinen einige zu haben.

    LG Alex

    Nachtrag:

    Es ist fast peinlich wie schwer man sich das Leben manchmal macht. Ich suche seit bestimmt 2 Monaten immer mal wieder mit
    mehr oder weniger Elan nach der Lösung für dieses Problem.

    Und jetzt die Lösung (So einfach und naheliegend, dass keiner darauf kommt)

    Unter Internetoptionen / Sicherheitseinstellungen - Manuell die Downloads deaktivieren ... und passt !!

    Danke nochmal.

    LG MyStik

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

    MyStik schrieb:

    Unter Internetoptionen / Sicherheitseinstellungen - Manuell die Downloads deaktivieren ... und passt !!

    Deswegen hatte ich oben den Punkt Sicherheitseinstellungen (ActiveX,Downloads) dazugeschrieben, allerrdings bin ich nicht sicher ob das auch die Uploads abdeckt. Vielleicht kannst Du uns das mal mitteilen ? .
    So verhinderst du den Download - Dialog.
    Stattdessen ladet er die Datei einfach runter, wo man den Ort im SaveFileDialog angegeben hat.
    Musst halt die Dateiendungen ergänzen ;)

    VB.NET-Quellcode

    1. Private Sub WebBrowser_Navigating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating
    2. If WebBrowser1.Url.ToString.EndsWith(".zip" Or ".rar" Or ".exe" Or ".tar.gz" Or ".tgz" ) Then
    3. e.Cancel = True
    4. If SaveFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK Then
    5. My.Computer.Network.DownloadFile(WebBrowser1.Url.ToString, SaveFileDialog1.FileName)
    6. End If
    7. End If
    8. End Sub
    Whos Faster ALPHA: Bald....