Knowing when an application is already open is critical for some applications. Look, an application such as Notepad or Microsoft Word does not have to check for multiple instances, but applications working with data or high-memory intensive applications could benefit from a single instance check. This article will demonstrate two ways to check whether the application is already running.
What Are Single Instance Applications?
A Single Instance application is an application that limits the program to run only one instance at a time. This means that you cannot open the same program twice.
Creating a Single Instance Application
Open Visual Studio and create a Windows Forms application in either C# or VB.NET.
On the form, add two buttons.
Set a reference to System.Management.
Add the next namespaces to your code:
C#
using System; using System.Threading; using System.Windows.Forms;
VB.NET
Imports System Imports System.Threading Imports System.Windows.Forms
Add the following function to your code:
C#
private static int CountInstances() { string[] strAppLoc = System.Reflection.Assembly .GetExecutingAssembly().Location.Split ("\".ToCharArray()); string strAppName = strAppLoc[strAppLoc.Length - 1]; string strProcessQuery = "select name from CIM_Process where name = '" + strAppName + "'"; System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher (strProcessQuery); int intCountInstances = 0; foreach (System.Management.ManagementObject item in searcher.Get()) { intCountInstances++; if (intCountInstances > 1) break; } return intCountInstances; }
VB.NET
Private Shared Function CountInstances() As Integer Dim strAppLoc As String() = System.Reflection.Assembly. _ GetExecutingAssembly().Location.Split("".ToCharArray()) Dim strAppName As String = strAppLoc(strAppLoc.Length - 1) Dim strProcessQuery As String = "select name from _ CIM_Process where name = '" & strAppName & "'" Dim searcher As System.Management.ManagementObjectSearcher = _ New System.Management.ManagementObjectSearcher _ (strProcessQuery) Dim intCountInstances As Integer = 0 For Each item As System.Management.ManagementObject In _ searcher.[Get]() intCountInstances += 1 If intCountInstances > 1 Then Exit For End If Next Return intCountInstances End Function
The CountInstance function makes use of WMI (Windows Method and Instrumentation) to find out if the application is listed in the currently running processes. Insert the call to the function now inside Button1.
C#
private void button1_Click(object sender, EventArgs e) { int intInstances = CountInstances(); if (intInstances <= 1) { Application.Run(new Form1()); } else { MessageBox.Show("Another instance of this program is already running. Close other instance first", "Already running", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); Application.Exit(); } }
VB.NET
Private Sub button1_Click(ByVal sender As Object, _ ByVal e As EventArgs) Handles button1.Click Dim intInstances As Integer = CountInstances() If intInstances <= 1 Then Application.Run(New Form1()) Else MessageBox.Show("Another instance of this program is _ already running. Close other instance first", _ "Already running", MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Application.[Exit]() End If End Sub
When Button1 is clicked, it calls the CheckInstance function to count the number of running instances of your application. If the count is less than 1, the application can run; otherwise, a MessageBox pops up, informing the user that another instance is already open.
Add the code for Button2.
C#
private void button2_Click(object sender, EventArgs e) { bool blnInstance; Mutex mutex = new Mutex(false, "Local\AppName", out blnInstance); if (!blnInstance) { Application.Exit(); } }
VB.NET
Private Sub button2_Click(ByVal sender As Object, _ ByVal e As EventArgs) Dim blnInstance As Boolean Dim mutex As Mutex = New Mutex(False, "LocalAppName", _ blnInstance) If Not blnInstance Then Application.[Exit]() End If End Sub
Inside Button2, I made use of a mutex to disable applications from being launched more than once at a time.
Conclusion
When it is needed, checking if there are more instances of an application should be done properly, without affecting any other process. I hope you have enjoyed today’s article.