Auf Formular verweisen bei nur einer Instanz

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Achilleus.

    Auf Formular verweisen bei nur einer Instanz

    Hallo Leute,

    ich habe ein ganz simples Programm mit nur einem Modul und einem Formular. Das Formular wird über eine Main-Sub aufgerufen.
    Mit dem Programm möchte ich Google-Maps aufrufen und um Verbindungen anzuzeigen.
    Das funktioniert einwandfrei.

    Ich möchte aber immer nur eine Instanz starten und das geöffnete Formular bzw. den Webbrowser aktualisieren.
    Das mit einer Instanz klappt schon, aber nicht mit dem aktualisieren des Webbrowsers.

    Was mache ich denn falsch?

    Main-Prozedur:

    Spoiler anzeigen


    VB.NET-Quellcode

    1. Module MdlMain
    2. Public Sub Main()
    3. Dim inputArgument As String = "/"
    4. Dim i As Integer
    5. For Each s As String In Environment.GetCommandLineArgs
    6. i = i + 1
    7. If s.ToLower.StartsWith(inputArgument) Then
    8. If s.Contains("Google") Then
    9. Dim Adress() = s.Split(";"c)
    10. Dim sLinkStart As String = Adress(1)
    11. Dim sLinkZiel As String = Adress(2)
    12. sLinkStart = "saddr=" & sLinkStart.Replace(" ", "+").Replace(",", "")
    13. sLinkZiel = "daddr=" & sLinkZiel.Replace(" ", "+").Replace("ö", "oe").Replace("ü", "ue").Replace("ä", "ae").Replace("ß", "ss").Replace(",", "")
    14. Call SearchGoogleAdress(sLinkStart, sLinkZiel)
    15. End If
    16. End If
    17. Next
    18. End Sub
    19. ' Anwendung bereits gestartet?
    20. Public Function AppPrevInstance(Optional ByVal bShowMsg As Boolean = True,
    21. Optional ByVal bAppActivate As Boolean = True) As Boolean
    22. ' Anzahl der gestarteten Prozesse der eigenen Anwendung
    23. If Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length > 1 Then
    24. ' Erst-Anwendung aktivieren
    25. If bAppActivate Then
    26. AppActivate(Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName)(1).Id)
    27. End If
    28. Return True
    29. Else
    30. Return False
    31. End If
    32. End Function
    33. Public Sub SearchGoogleAdress(sLinkStart As String, sLinkZiel As String)
    34. Dim sLink As String = "https://maps.google.com/maps?" & sLinkStart & "&" & sLinkZiel
    35. If AppPrevInstance() Then
    36. With FrmGoolgeMaps
    37. .WB_GooglMaps.Navigate(sLink)
    38. End With
    39. Else
    40. With FrmGoolgeMaps
    41. .WB_GooglMaps.Navigate(sLink)
    42. .ShowDialog()
    43. End With
    44. End If
    45. End Sub
    46. End Module




    Kann mir einer vielleicht ein Schubs in die richtige Richtung geben?
    Vielen Dank im Voraus.

    Gruß Achilleus
    Hallo Leute,

    ich bin nun etwas weiter gekommen.
    Zum einen habe ich von der Sub Main auf das einzige Formular umgestellt und das Projekt als Einzelanwendung umgestellt.
    In den Anwendungereignissen habe ich jetzt folgende Sub-Routine:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub MyApplication_StartupNextInstance(sender As Object, e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
    2. Dim inputArgument As String = "/"
    3. Dim i As Integer
    4. For Each s As String In Environment.GetCommandLineArgs
    5. i = i + 1
    6. If s.ToLower.StartsWith(inputArgument) Then
    7. MessageBox.Show(s.ToString)
    8. If s.Contains("Google") Then
    9. Dim Adress() = s.Split(";"c)
    10. Dim sLinkStart As String = Adress(1)
    11. Dim sLinkZiel As String = Adress(2)
    12. sLinkStart = "saddr=" & sLinkStart.Replace(" ", "+").Replace(",", "")
    13. sLinkZiel = "daddr=" & sLinkZiel.Replace(" ", "+").Replace("ö", "oe").Replace("ü", "ue").Replace("ä", "ae").Replace("ß", "ss").Replace(",", "")
    14. Dim sLink As String = "https://maps.google.com/maps?" & sLinkStart & "&" & sLinkZiel
    15. FrmGoogleMaps.text = "Google-Maps: " & sLink.ToString
    16. FrmGoogleMaps.WB_GooglMaps.Navigate(sLink)
    17. FrmGoogleMaps.WB_GooglMaps.Refresh
    18. System.Windows.Forms.Application.DoEvents()
    19. End If
    20. End If
    21. Next
    22. End Sub


    Ich habe jetzt aber festgestellt, dass sich die Environment.GetCommandLineArgs aber beim zweiten Aufruf gar nicht ändern. ;(

    Das Programm rufe ich ausschließlich aus Access heraus auf und zwar mit folgendem simplen Aufruf:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub BtnGoogle_Click()
    2. Dim sLinkStart As String: sLinkStart = txtStartAdresse.value
    3. Dim sLinkTarget As String: sLinkTarget = cmbStraße.value
    4. Dim sBatch As String
    5. sBatch = "E:\RoseSoft\Google.exe" & " " & """" & "/Google;" & sLinkStart & ";" & sLinkTarget & """"
    6. Shell sBatch, vbNormalNoFocus
    7. End Sub[/spoiler][spoiler]


    Die Argumente sLinkStart und sLinkTarget werden korrekt befüllt, aber beim dem Google-Programm kommen die nicht an.

    Was mache ich denn hier falsch?
    Ich könnte natürlich die Parameter auch in eine Txt-Datei speichern und diese dann immer auslesen, aber gibt es denn hier keine sinnvolle Lösung?



    Nachtrag:

    Ich habe die Lösung gefunden.
    Ich musste einfach auf die e.Commandline von der Sub MyApplication_StartupNextInstance verweisen und schon läuft es.
    Ferner muss ich anscheinend den Webbrowser auch erst einmal mit about:blank neu initialisieren. Erst dann hatte er die Suche neu gestartet.

    Hier nun meine vollständige (endgültige) Lösung:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub MyApplication_StartupNextInstance(sender As Object, e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
    2. Dim inputArgument As String = "/"
    3. Dim i As Integer
    4. For Each s As String In e.CommandLine
    5. i = i + 1
    6. If s.ToLower.StartsWith(inputArgument) Then
    7. If s.Contains("Google") Then
    8. Dim Adress() = s.Split(";"c)
    9. Dim sLinkStart As String = Adress(1)
    10. Dim sLinkZiel As String = Adress(2)
    11. sLinkStart = "saddr=" & sLinkStart.Replace(" ", "+").Replace(",", "")
    12. sLinkZiel = "daddr=" & sLinkZiel.Replace(" ", "+").Replace("ö", "oe").Replace("ü", "ue").Replace("ä", "ae").Replace("ß", "ss").Replace(",", "")
    13. Dim sLink As String = "https://maps.google.com/maps?" & sLinkStart & "&" & sLinkZiel
    14. FrmGoogleMaps.WB_GooglMaps.Navigate("about:blank")
    15. System.Windows.Forms.Application.DoEvents()
    16. FrmGoogleMaps.Text = "Google-Maps: " & sLink.ToString
    17. FrmGoogleMaps.WB_GooglMaps.Navigate(sLink)
    18. System.Windows.Forms.Application.DoEvents()
    19. End If
    20. End If
    21. Next
    22. End Sub



    Gruß Achilleus

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Achilleus“ () aus folgendem Grund: Lösung gepostet