Pregunta: | 66013 - MAXIMIZAR DESDE NOTIFYICON |
Autor: | Jose Rodriguez Rodriguez |
Hola Buenas y gracias de antemano
Mi aplicación se puede minimizar a la bandeja del sistema (Al lado del reloj de windows vamos), lo que yo quiero es que: cuando el usuario intente ejecutar la aplicación por segunda vez desde el acceso directo del escritorio y la aplicación ya este ejecutada y minimizada en la bandeja del sistema, que simplemente se Maximice. Es decir si ya hay una instancia abierta de la aplicación que se maximice y que no se abra otra instancia. un saludo. |
Respuesta: | Jose Rodriguez Rodriguez |
Esta es la respuesta que encontre pero sigue sin maximizarme
Public Class clsInstanciaPrevia ' Mutex local para sólo permitir una instancia de la aplicación por usuario Private Shared _mutex As System.Threading.Mutex 'API de Windows <System.Runtime.InteropServices.DllImport("user32.dll")> _ Private Shared Function ShowWindow(ByVal hWnd As System.IntPtr, ByVal nCmdShow As Integer) As Integer End Function <System.Runtime.InteropServices.DllImport("user32.dll")> _ Private Shared Function SetForegroundWindow(ByVal hWnd As System.IntPtr) As Integer End Function Private Const SW_SHOWMAXIMIZED As Integer = 3 Private Const SW_SHOWNORMAL As Integer = 1 'Enumerador para inicar el tipo de bloqueo Public Enum eTipo As Integer POR_SESION = 0 [GLOBAL] = 1 End Enum 'Función que devuelve TRUE si ya existe una instancia previa del programa corriendo 'En caso de que la aplicación estuviera corriendo, intenta darle foco a la ventana principal Public Shared Function InstanciaPrevia(ByVal Tipo As eTipo) As Boolean 'Obtengo el nombre del ensamblado donde se encuentra ésta función Dim NombreAssembly As String = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name 'Nombre del mutex según Tipo (visibilidad) Dim mutexName As String = If(Tipo = eTipo.GLOBAL, "Global", "Local") & NombreAssembly Dim newMutexCreated As Boolean Try 'Abro/Creo mutex con nombre único _mutex = New System.Threading.Mutex(False, mutexName, newMutexCreated) If newMutexCreated Then 'Se creó el mutex, NO existe instancia previa Return False Else 'El mutex ya existía, Libero el mutex _mutex.Close() 'Intento otorgar el foco al programa ya abierto anteriormente If Not MostrarVentanaPPalProceso() Then 'No se encontró la ventana principal MsgBox("Ya existe una instancia previa del programa corriendo.") End If Return True End If Catch ex As Exception MsgBox(ex.Message) Return False End Try End Function 'Intenta mostrar la ventana principal de los procesos con mi mismo nombre Private Shared Function MostrarVentanaPPalProceso() As Boolean Dim sProcessName As String = Process.GetCurrentProcess.ProcessName 'Apuntador a la ventana ppal del proceso con nombre sProcessName Dim mainhWnd As System.IntPtr = _ (From p In Process.GetProcessesByName(sProcessName) _ Where Not p.MainWindowHandle.Equals(IntPtr.Zero) _ Select p.MainWindowHandle).FirstOrDefault If Not mainhWnd.Equals(IntPtr.Zero) Then 'Muestro la ventana SetForegroundWindow(mainhWnd) ShowWindow(mainhWnd, SW_SHOWNORMAL) Return True Else Return False End If End Function End Class |