Doublons possibles:
Quelle est la bonne façon de créer une application à instance unique?
Retour à une application déjà ouverte lorsqu'un utilisateur essaie d'ouvrir une nouvelle instance
Quelqu'un pourrait-il montrer comment il est possible de vérifier si une autre instance du programme (par exemple test.exe) est en cours d'exécution et, dans l'affirmative, arrêter le chargement de l'application s'il existe une instance existante de celui-ci.
Vous voulez du code sérieux? C'est ici.
var exists = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1;
Cela fonctionne pour n'importe quelle application (n'importe quel nom) et deviendra true
s'il y a une autre instance en cours d'exécution de la même application .
Modifier: pour résoudre vos besoins, vous pouvez utiliser l'un des éléments suivants:
if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) return;
de votre méthode principale pour quitter la méthode ... OU
if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) System.Diagnostics.Process.GetCurrentProcess().Kill();
ce qui tuera instantanément le processus de chargement en cours.
Vous devez ajouter une référence à System.Core.dll pour la .Count()
méthode d'extension. Vous pouvez également utiliser la propriété .Length
.
Vous ne savez pas ce que vous entendez par "le programme", mais si vous souhaitez limiter votre application à une seule instance, vous pouvez utiliser un Mutex pour vous assurer que votre application n'est pas déjà en cours d'exécution.
[STAThread]
static void Main()
{
Mutex mutex = new System.Threading.Mutex(false, "MyUniqueMutexName");
try
{
if (mutex.WaitOne(0, false))
{
// Run the application
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
else
{
MessageBox.Show("An instance of the application is already running.");
}
}
finally
{
if (mutex != null)
{
mutex.Close();
mutex = null;
}
}
}
Voici quelques bons exemples d'applications. Voici une façon possible.
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName (current.ProcessName);
//Loop through the running processes in with the same name
foreach (Process process in processes)
{
//Ignore the current process
if (process.Id != current.Id)
{
//Make sure that the process is running from the exe file.
if (Assembly.GetExecutingAssembly().Location.
Replace("/", "\\") == current.MainModule.FileName)
{
//Return the other process instance.
return process;
}
}
}
//No other instance was found, return null.
return null;
}
if (MainForm.RunningInstance() != null)
{
MessageBox.Show("Duplicate Instance");
//TODO:
//Your application logic for duplicate
//instances would go here.
}
De nombreuses autres manières possibles. Voir les exemples pour des alternatives.
EDIT 1: Je viens de voir votre commentaire que vous avez une application console. Cela est discuté dans le deuxième échantillon.
Vous pouvez essayer ceci
Process[] processes = Process.GetProcessesByName("processname");
foreach (Process p in processes)
{
IntPtr pFoundWindow = p.MainWindowHandle;
// Do something with the handle...
//
}
La classe statique Process possède une méthode GetProcessesByName () que vous pouvez utiliser pour rechercher dans les processus en cours d'exécution. Recherchez simplement tout autre processus portant le même nom d'exécutable.