Click here to Skip to main content
6,635,160 members and growing! (17,458 online)
Email Password   helpLost your password?
Languages » VB.NET » General     Intermediate

Single Instance of Application

By petervn

Shows a very generic way to find out if another instance of the application is already running and activate the running instance's main window by bringing it to the foreground.
VB.NET 1.0, .NET 1.1, WinXP, Visual Studio, Dev
Posted:12 Oct 2003
Views:60,937
Bookmarked:29 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
18 votes for this article.
Popularity: 4.42 Rating: 3.52 out of 5
4 votes, 22.2%
1
1 vote, 5.6%
2
1 vote, 5.6%
3
3 votes, 16.7%
4
9 votes, 50.0%
5

Introduction

Brief preamble: Some time ago I was looking for a way to find out if another instance of the application is already running. A trivial task as you may say and I would agree with you instantly as long as you are familiar with Win32 API. I looked around on various sites including this one and found a few interesting articles, including an article talking at length how to set up a well-known object to pass command line parameters to an existing instance (a good DDE replacement), which is nice but not exactly what I was looking for. I needed something quick and dirty and so here it goes.

Public NotInheritable Class Win32Helper 
<System.Runtime.InteropServices.DllImport("user32.dll", _ 
EntryPoint:="SetForegroundWindow", _
CallingConvention:= Runtime.InteropServices.CallingConvention.StdCall, _
CharSet:=Runtime.InteropServices.CharSet.Unicode, SetLastError:=True)> _
Public Shared Function _ 
     SetForegroundWindow(ByVal handle As IntPtr) As Boolean
' Leave function empty

End Function

<System.Runtime.InteropServices.DllImport("user32.dll", _ 
EntryPoint:="ShowWindow", _
CallingConvention:=Runtime.InteropServices.CallingConvention.StdCall, _
CharSet:=Runtime.InteropServices.CharSet.Unicode, SetLastError:=True)> _
Public Shared Function ShowWindow(ByVal handle As IntPtr, _ 
                             ByVal nCmd As Int32) As Boolean
' Leave function empty 

End Function

End Class ' End Win32Helper 


Public Shared Function GetRunningInstance(ByVal _ 
                   processName As String) As Process
    Dim proclist() As Process = _ 
       Process.GetProcessesByName(processName)
    For Each p As Process In proclist
        If p.Id <> Process.GetCurrentProcess().Id Then
            Return p
        End If
    Next
    Return Nothing
End Function

'The main entry point for the application

Public Shared Sub Main()
    Dim pInstance As Process = _ 
      Win32Helper.GetRunningInstance(Process.GetCurrentProcess().ProcessName)
    If Not pInstance Is Nothing Then
        Dim handle As IntPtr = pInstance.MainWindowHandle
        If Not IntPtr.Zero.Equals(handle) Then
            Win32Helper.ShowWindow(handle, 1)
            Win32Helper.SetForegroundWindow(handle)
        End If
        Application.ExitThread()
    Else
        Dim context As ApplicationContext = _ 
           New ApplicationContext(New MainFrame) 
        Application.Run(context)
    End If
End Sub

Few last comments: I had to resort to a no-so-graceful approach (as compared to using remoting) as needed to activate a main window of the running instance if one was found. Mutexes wouldn't help either.

For those on a look out for any trace plagiarism I should perhaps add, this is my adaptation of already well known methods. This is just my humble contribution for others who may find this all somewhat useful.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

petervn


Member

Location: United States United States

Other popular VB.NET articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 13 of 13 (Total in Forum: 13) (Refresh)FirstPrevNext
GeneralMain() function PinmemberAnu.....S/W Developer0:18 12 Nov '08  
General4+ years later, exactly what I needed. Thx! (n/t) PinmemberGary Noter11:50 10 Dec '07  
GeneralDoes not activate main window PinmemberDeepak Sakpal23:58 14 Feb '07  
GeneralRe: Does not activate main window Pinmemberpetervn18:19 2 May '07  
GeneralExcellent Code PinmemberKestrel210:29 5 Oct '06  
GeneralThanks PinmemberMr. Beasimer13:10 20 Jul '06  
GeneralRe: Thanks PinmemberLBeasimer8:23 18 Sep '06  
Generalrestore from minimized state Pinmemberjkakermott12:09 12 Apr '06  
GeneralVery good code! PinmemberGiakkomino6:56 4 Mar '06  
GeneralNeeds Process Performance Counter Pinmemberjtencate9:47 7 Feb '06  
GeneralSingle Instance Code PinmemberFade (Amit BS)4:24 7 May '05  
GeneralHow can Start .exe program depending the Principal Process PinmemberVitoto11:24 4 May '05  
GeneralValue of article PinmemberRede2:46 14 Oct '03  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 12 Oct 2003
Editor: Smitha Vijayan
Copyright 2003 by petervn
Everything else Copyright © CodeProject, 1999-2009
Web21 | Advertise on the Code Project