Empecher une applic. de se lancer 2 fois

Soyez le premier à donner votre avis sur cette source.

Snippet vu 23 214 fois - Téléchargée 25 fois

Contenu du snippet

Astuce bien connue de certains et moins d'autres programmeurs pour empêcher une application de se lancer deux fois, il suffit d'agir au niveau des processus.

On parcourt tout d'abord tous les processus actifs, on s'assure que l'ID du processus est bien différente de celle des programmes que l'on compare pour ne ne pas considérer l'application courante comme en doublon avec elle-même puis si le nom des processus est identique, il s'agit bel et bien d'un deuxième lancement.

Pour pouvoir manipuler ces processus, on fait tout d'abord référence à l'espace de noms Diagnostics.

Source / Exemple :


//******************
//En début de code
//******************
using System.Diagnostics;

//******************************************************
//Au chargement (Main() ou dans Form_Load() pour applic. Windows
//******************************************************
//Obtient le processus en cours de l'application
Process Proc_EnCours = Process.GetCurrentProcess();
//Collection des processus actuellement lancés
Process[] Les_Proc = Process.GetProcesses();
//Pour chaque processus lancé
foreach (Process Processus in Les_Proc)
	/*Il ne faut pas comparer par rapport à cette instance
		du programme mais une autre (grâce à l'ID)*/
	if (Proc_EnCours.Id != Processus.Id)
		//Si les ID sont différents mais de même nom ==> 2 fois le même programme
		if (Proc_EnCours.ProcessName == Processus.ProcessName)
		{
		MessageBox.Show("Le programme ne peut pas être lancé 2 fois!");
		this.Close();
		}

A voir également

Ajouter un commentaire

Commentaires

Messages postés
22
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
27 janvier 2012

Bonjour à tous, quelqu'un pourrait il m'aider a reformuler cette fonction pour mon application en C++, avec mes modifs mon appli ne se lance plus . je suis novice en programmation, Merci d'avance pour votre aide.
voila ou j'en suis:
Process^ Proc_EnCours = gcnew Process;
Proc_EnCours = Process::GetCurrentProcess();
array^Les_Proc = Process::GetProcesses();
for each (Process^ processus in Les_Proc);
if (Proc_EnCours->ProcessName == processus->ProcessName)
{MessageBox::Show("Le programme ne peut pas être lancé 2 fois!");
this->Close();
}
else
{
///////
}
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
80
Salut,

Tu vas devoir passer par un mécanisme d'IPC (Interprocess Communications).
- Remoting
- message Windows "perso" que tu traites par un filtre ou la méthode WndProc (voir WM_APP, WM_USER)
- Data Copy (WM_COPYDATA)
- etc : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ipc/base/interprocess_communications.asp)

Bon courage :-)
Messages postés
216
Date d'inscription
dimanche 13 janvier 2002
Statut
Modérateur
Dernière intervention
7 novembre 2009

bonjour,
Je sais regarder si mon appli est déjà lancée, mais il manque quand même quelquechose dans vos sources :)
J'ai une application de type NOTEPAD mais en MDI. J'empêche donc que mon application démarre deux fois, mais .... dans le cas ou celle-ci est démarrée, je voudrais lui demander de charger le nouveau fichier TXT que j'envois dans le Args[]

Avez vous une solution pour lancer une procédure dans le process qui est déjà lancé ?

Amicalement,
Messages postés
412
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
13 août 2007

string mutName = "87939A67-2893-470D-82EF-45A525BB31AB";

bool isNew = false;
Mutex mut = new Mutex(false, mutName,out isNew);

if (!isNew) return;

Application.Run(new Form1());
Messages postés
412
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
13 août 2007

Les mutex c'est quand même mieux pour voir si l'appli est déjà démarrée.. Tu y fous un GUID, et t'as vraiment quasiment aucune chance que ça prenne un programme pour un autre.
Afficher les 15 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.