[WPF – NET 7.0] – Aplicación Singleton (de instancia única)

Descripción general:

El codigo que se muestra a cointienuacion permite que la aplicacion se ejecute como una aplicacion de instancia unica

Para conseguir ese objeto usaremos el evento [ Startup ] de la clase [ Application ] escribiendo el código que se muestra a continuación


Class Application

    ''' <summary>
    ''' Indica si la aplicación es de instancia única (solo se ejecuta una vez) [True]
    ''' o bien puede haber varias instancias de la misma funcionando [False]
    ''' Se comprueba en el evento [Startup]
    ''' </summary>
    Private Shared ReadOnly campoEsIntanciaUnica As   Boolean = True

    ''' <summary>
    ''' Se produce cuando se llama al método Run() del objeto Application.
    ''' </summary>
    ''' <remarks>
    '''    <dcterms.abstract>
    '''       <content>
    '''          Aquí se comprueba si existe otra aplicación rodando y si es así
    '''          se cierra la aplicación para que solo se este ejecutando una
    '''       </content>
    '''    </dcterms.abstract>
    '''    <dcterms.bibliographicCitation>
    '''       <content>https://learn.microsoft.com/es-es/dotnet/api/system.windows.application.startup?view = windowsdesktop-7.0</content>
    '''    </dcterms.bibliographicCitation>
    '''    <dcterms.created>
    '''       <scheme>dcterms.ISO8601</scheme>
    '''       <content>2023-10-15 T 22:24:47</content>
    '''    </dcterms.created>
    ''' </remarks>
    Private Sub Application_Startup(sender As Object, e As StartupEventArgs) Handles Me.Startup
        '--------------------------------------------------------
        ' Comprobación de Instancia única (Singleton)
        ' [campoEsIntanciaUnica]
        ' Indica si la aplicación es de instancia única (solo se ejecuta una vez) [True]
        ' o bien puede haber varias instancias de la misma funcionando [False]
        '-------------
        If campoEsIntanciaUnica = True Then
            ' Obtener el proceso en ejecución
            Dim thisProc As Process = Process.GetCurrentProcess()
            ' Obtener el nombre del proceso
            ' si hay mas de un proceso con el mismo nombre
            ' hay que cerrar uno de ellos
            If Process.GetProcessesByName(thisProc.ProcessName).Length > 1 Then
                '-------------------------------------------------------------------------------
                ' Mensaje avisando de que la aplicación ya se esta ejecutando
                '
                Dim caption As String = "PROBLEMA"
                Dim message As String = "La aplicación ya se esta ejecutando. Es de instancia única. Se cierra la nueva, solo una funciona"
                Dim buttons As MessageBoxButton = MessageBoxButton.OK
                Dim icon As MessageBoxImage = MessageBoxImage.Warning
                Dim defaultResult As MessageBoxResult = MessageBoxResult.OK
                Dim options As MessageBoxOptions = MessageBoxOptions.None
                'Show message box
                Dim result As MessageBoxResult = MessageBox.Show(message, caption, buttons, icon, defaultResult, options)
                '-------------------------------------------------------------------------------
                ' cerrando el proceso
                Application.Current.Shutdown()
            End If
        End If
        ' /Eof Instancia única (Singleton)
        '--------------------------------------------------------
    End Sub
End Class