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
// 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(); } }