Índice de la sección dedicada a .NET (en el Guille)   .NET Compact Framework

PrevInstance
Cómo saber si una aplicación ya se está ejecutando, y si es así mostrarla.


Publicado el 07/Jul/2002
Revisado el 07/Jul/2002

Cómo saber si una aplicación ya se está ejecutando, y si es así mostrarla.

Y de paso cerrar la segunda instancia...

Pues eso es lo que muestra el siguiente código, tanto para Visual Basic.NET como para C#.
Para conseguirlo, se utilizan dos funciones del API de Windows CE: FindWindow y SetForegroundWindow
Estas dos funciones también están en el API de Win    dows 32, pero en el caso de Windows CE se encuentran en la librería CoreDLL.DLL.
El truco está en ponerlas en el procedimiento Main, ya que este procedimiento se ejecuta antes de cargar o crear el formulario.
Veamos el código tanto para Visual Basic como para C#


 

El código para Visual Basic.NET

' Funciones del API
<System.Runtime.InteropServices.DllImport("coredll.dll", _
        EntryPoint:="SetForegroundWindow")> _
Private Shared Function SetForegroundWindow( _
        ByVal hWnd As IntPtr) As Boolean
End Function
'
<System.Runtime.InteropServices.DllImport("coredll.dll", _
        EntryPoint:="FindWindow")> _
Private Shared Function FindWindow( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As IntPtr
End Function


' El Sub Main debería quedar así:
Public Shared Sub Main()
    Dim nWnd As IntPtr
    Dim ceroIntPtr As New IntPtr(0)
    '
    ' Form caption -------------v
    nWnd = FindWindow(Nothing, "eNotas.NET")
    If nWnd.Equals(ceroIntPtr) Then
        Application.Run(New fNotas())
    Else
        SetForegroundWindow(nWnd)
        Application.Exit()
    End If
End Sub

 

El código para C#

// Funciones del Api
[DllImport("coredll",EntryPoint="FindWindow")]
private static extern IntPtr FindWindow( 
        string lpClassName, 
        string lpWindowName);

[DllImport("coredll",EntryPoint="SetForegroundWindow")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

// Main debería quedar así:
static void Main() 
{
    // Form caption ----------------v
    IntPtr nWnd = FindWindow(null, "eNotas.CS");

    if(nWnd.Equals(new System.IntPtr(0)))
    {
        Application.Run(new fNotas());
    }
    else
    {
        SetForegroundWindow(nWnd);
        Application.Exit();
    }
}

la Luna del Guille o... el Guille que está en la Luna... tanto monta...