Doppelstart verhindern und Anwendung in den Vordergrund bringen

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

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

    Doppelstart verhindern und Anwendung in den Vordergrund bringen

    Hallo Leute,

    ich prüfe in meiner Anwendung ob diese bereits einmal gestartet wurde und gebe eine Meldung aus und beende den zweiten Start, falls dies der Fall ist:

    VB.NET-Quellcode

    1. 'Prüfen ob Anwendung bereits läuft
    2. If System.Diagnostics.Process.GetProcessesByName(System.Reflection.Assembly.GetExecutingAssembly.GetName.Name).Length > 1 Then
    3. MessageBox.Show("Application is already running!", "Application is already running!", MessageBoxButtons.OK, MessageBoxIcon.Stop)
    4. End
    5. End If


    Nun möchte ich aber statt der Messagebox die bereits vorher gestartete Anwendung in den Vordergrund holen.
    Kann ich das irgendwie über den Wert aus System.Diagnostics.Process.GetProcessesByName tun oder muss ich da über die WinAPI FindWindow fahren?
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Hi,
    da gibt es in der ApplicationEvents.vb ein Event für

    VB.NET-Quellcode

    1. ​Private Sub MyApplication_StartupNextInstance(sender As Object, e As ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance


    dort abfragen ob deine Hauptform schon gestartet ist.
    e hat dann eine Methode:

    VB.NET-Quellcode

    1. ​e.BringToForeground = True


    wenn nicht gestarte, dann neue Form erstellen und anzeigen
    "Hier könnte Ihre Werbung stehen..."
    In den Projekteinstellungen lässt sich die Anwendung als Einzelinstanzanwendung festlegen
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    In den Projekteinstellungen lässt sich die Anwendung als Einzelinstanzanwendung festlegen


    Das kenne ich, ist aber für meine App nicht anwendbar, da ich diese in bis zu drei Instanzen (abhängig vom Startparameter) starten können muss.
    Je nach Instanz werden verschiedene Fenster geöffnet.
    Wenn z.B. das Hauptfenster schon offen ist, dann soll die "Hauptinstanz" nicht noch ein zweites Mal gestartet werden.

    Was ich hinbekommen habe ist die Variante mit der Win32api.
    Dachte mir, dass es sowas auch mit dem Process geben sollte, dürfte es aber wohl nicht.


    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Win32Api
    3. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    4. Public Shared Function FindWindow(
    5. ByVal lpClassName As String,
    6. ByVal lpWindowName As String) _
    7. As IntPtr
    8. End Function
    9. <DllImport("user32.dll")>
    10. Public Shared Sub SetForegroundWindow(
    11. ByVal hWnd As IntPtr)
    12. End Sub
    13. <DllImport("user32.dll")>
    14. Public Shared Sub ShowWindow(
    15. ByVal hwnd As IntPtr, ByVal nCmdShow As Int32)
    16. End Sub
    17. End Class
    18. Sub Main()
    19. 'Prüfen ob Anwendung bereits läuft
    20. If System.Diagnostics.Process.GetProcessesByName(System.Reflection.Assembly.GetExecutingAssembly.GetName.Name).Length > 1 Then
    21. 'MessageBox.Show("Application is already running!", "Application is already running!", MessageBoxButtons.OK, MessageBoxIcon.Stop)
    22. Dim Processes() As Process = Process.GetProcesses
    23. For Each hProcess As Process In Processes
    24. If hProcess.ProcessName.Contains("Simple Calendar") Then
    25. Dim [Handle] As IntPtr = Win32Api.FindWindow(Nothing, hProcess.MainWindowTitle)
    26. If (Not [Handle].Equals(IntPtr.Zero)) Then
    27. Win32Api.SetForegroundWindow([Handle])
    28. Win32Api.ShowWindow([Handle], 9)
    29. End If
    30. End If
    31. Next
    32. End
    33. End If
    34. End sub
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Soviel mir es recht ist, besitzt VS schon selber Möglichkeiten, zum Erkennen der Instanzen.

    VB.NET-Quellcode

    1. For Each frm As Form In My.Application.OpenForms
    2. If GetType(Form).IsAssignableFrom(frm.GetType) Then


    Eventuell könnte aber auch das hier helfen
    API Deklarationen

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()