Torna al Thread
Private Declare Function SetForegroundWindow Lib "user32" (ByVal handle As IntPtr) As Integer
<DllImport("user32.dll")> _
Private Shared Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal nMaxCount As Integer) As Integer
End Function
Private Delegate Function EnumWindowProc(ByVal hwnd As IntPtr, ByVal lParam As IntPtr) As Boolean
<DllImport("user32.dll")> _
Private Shared Function EnumWindows(ByVal lpEnumFunc As EnumWindowProc, ByVal lParam As IntPtr) As Boolean
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'il nome del mutex
Const MUT_NAME As String = "SINGIST"
'il mutex
Dim mut As Mutex = Nothing
'prova ad aprire il mutex
Try
mut = Mutex.OpenExisting(MUT_NAME)
Catch
'non fa niente
End Try
If mut Is Nothing Then
'se il mutex non esisteva lo crea
mut = New Mutex(True, MUT_NAME)
Else
'se invece esisteva, l'applicazione è già aperta
'quindi la visualizza e chiude quella corrente
'Modifica il titolo corrente per non confonderlo con quello dell'altra finestra
Me.Text &= "_Closing"
'Avvia il processo di enumerazione delle finestre che si incarica
'di portare in primo piano la finetra già aperta
EnumWindows(AddressOf OpenInstance, Nothing)
End If
End Sub
Private Function OpenInstance(ByVal hwnd As IntPtr, ByVal lParam As IntPtr) As Boolean
'se l'handle è lo stesso della Form del processo corrente continua la ricerca
If hwnd = Me.Handle Then
'ritornando true la ricerca continua, ritornando false la ricerca termina
Return True
End If
'Ottiene il testo della finestra per verificare che corrisponda a quello attuale
Dim sb As New StringBuilder
GetWindowText(hwnd, sb, Me.Text.Length)
'se corrisponde (eccetto il _Closing) mostra la finestra, altrimenti continua la ricerca
If (sb.Length > 0 AndAlso Me.Text.StartsWith(sb.ToString())) Then
SetForegroundWindow(hwnd)
Process.GetCurrentProcess.Kill()
Else
Return True
End If
End Function