Hi Larry,
Thanks for the information. I google this issue and found some different approaches, I combined two of them and was able to put together a solution that will will do just what is expected from the user: if the application is minimized, it will just bring it to the from.
Of course this solution is not as simple as using the Mutex and may have other issues since it uses the System.Diagnostics.Process to get to the application.
Ok here is the code.. Copy these 2 classes to a new class file in the main project I called mine "SingleInstance.vb" or if you have a based class in the main .exe project you could use that as well.
#Region " Code to handle a single instance of the application "
'Windows API
Declare Function OpenIcon Lib "user32" (ByVal hwnd As Long) As Long
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
'''
''' Function to check and see if an instance of the application is already open
''' '''
Name of the application
'''
True/False '''
Public Shared Function IsAlreadyOpen(ByVal sApp As String) As Boolean
'Check running processes to see if application is already running
Dim pProcess As Process() = System.Diagnostics.Process.GetProcessesByName(sApp)
If pProcess.Length > 1 Then 'If > 1 then its already running
Return True
Else 'Not running
Return False
End If
End Function
Public Shared Sub ActivatePrevInstance(ByVal argStrAppToFind As String)
Dim PrevHndl As Long
Dim result As Long
Dim objProcess As New Process 'Variable to hold individual Process
Dim objProcesses() As Process 'Collection of all the Processes running on local machine
objProcesses = Process.GetProcesses() ''Get all processes into the collection
For Each objProcess In objProcesses
If UCase(objProcess.ProcessName) = UCase(argStrAppToFind) Then
If Not String.IsNullOrEmpty(objProcess.MainWindowTitle) Then
'MessageBox.Show(objProcess.MainWindowTitle)
PrevHndl = objProcess.MainWindowHandle.ToInt32()
Exit For
End If
End If
Next
If PrevHndl = 0 Then Exit Sub 'if No previous instance found exit the application.
''If found
result = OpenIcon(PrevHndl) 'Restore the program.
result = SetForegroundWindow(PrevHndl) 'Activate the application.
End 'End the current instance of the application.
End Sub
#End Region
Now like in your case, to execute it in the AppMain.vb after the "Public Shared Sub Main()" add this code:
If SingleInstance.IsAlreadyOpen(My.Application.Info.ProductName) Then
SingleInstance.ActivatePrevInstance(My.Application.Info.ProductName)
Exit Sub
End If
Edhy Rijo