Un seul process avec notification de demande d'ouverture

Signaler
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009
-
ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
-
Bonjour,

Mon titre n'est pas clair, et c'est pour cela que mes recherches ne donnent rien.

Je cherche à faire en sorte que mon application ne puisse se lancer qu'une fois, mais que lorsque que l'on tente de la lancer plus d'une fois, que l'application déjà lancer recoive un message pour lui signaler la demande.

Mon but est de pouvoir lancer une autre fenêtre principale, mais dans le même contexte(meme process) afin de limiter et partager certains objets en mémoire et éviter certains accès concurentiels sur des fichiers.

Merci pour votre aide

<hr />I love .net

7 réponses

Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
52
Hello,

Pour vérifier le lancement d'autres instances de l'application, regarde du côté de Process.GetProcessByName. Si le résultat contient plus de 1 process, c'est qu'il y en a déjà un en cours.

Pour dialoguer entre tes process, c'est un peu plus compliqué. Tu peux passer par des queues de messages (style MSMQ), ou faire du remoting, par exemple avec IPC.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
43
Tu peux jeter un oeil sur cette source
http://www.csharpfr.com/codes/APPLICATION-NE-POUVANT-ETRE-LANCE-QU-SEULE-FOIS_42201.aspx

Voire aussi celle-ci  (dans les commentaires surtout en fait):
http://www.csharpfr.com/codes/EMPECHER-APPLIC-LANCER-FOIS_20698.aspx

<hr />
-My Blog-
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Le problème est que j'utilise un "ApplicationContext" et que je n'ai pas forcément de fenêtre principale active, j'ai juste un icone Systray.
J'ai mis un filtre de message dans ma classe héritant de ApplicationContext, ca marche tout très bien tant que j'ai un formulaire actif.

J'aimerais savoir s'il est possible d'utiliser un Handle globale au processus pour envoyer un message avec PostMessage
J'ai essayé ca (j'ai sans doute fait n'inporte quoi):

Process current = Process.GetCurrentProcess();
Process[] processCollection = Process.GetProcessesByName(current.ProcessName);
foreach (Process process in processCollection)
{
if (process.Handle == current.Handle) continue;
API.PostMessage(process.Handle, wmId, IntPtr.Zero, IntPtr.Zero);
}

Mais ca ne fonctionne pas, il y a jamais de process.Handle == current.Handle
<hr />I love .net
Messages postés
379
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
20 avril 2011
1
Bonjour,
Si l'utilisateur n'est pas admin, on ne peut pas lister les processus.

Microsoft recommance l'utilisation des mutex.

Un exemple :

ajouter une classe :

class

InstanceUnique :
IDisposable{

private
Mutex mMutex;

private
bool mMutexOwned;

///<summary>

/// Constructeur

///</summary>

///Nom de notre application

public InstanceUnique(
string name){

mMutex =

new
Mutex(
false, name);mMutexOwned =

false;}

// Application déjà lancée ?

///<summary>

/// Application en cours.

///</summary>

///<returns>True si déjà en cours</returns>

public
bool IsRunning(){

// Récupération du mutexmMutexOwned = mMutex.WaitOne(0,

true);

return !(mMutexOwned);}

///<summary>

/// Libération du mutex si il a été acquis

///</summary>

public
void Dispose(){

if (mMutexOwned)mMutex.ReleaseMutex();

}

}

Puis dans le main du programme :

[

STAThread]

static
void Main(){

/// Si une autre application cours d'exécution crée un mutex ayant le même nom que celui de données ci-dessous,

/// cette dernière ne pourra plus se lancer. Choisissez un nom assez compliqué pour votre mutex.

using (
InstanceUnique instanceUnique =
new
InstanceUnique(
"{unNomSuperComplique}")){

if (instanceUnique.IsRunning()){

MessageBox.Show(
"L'application est déjà en cours d'execution.\n\n Fermez la fenêtre active puis re-essayez.",
"Application");}

else{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(
false);

Application.Run(
new
frmMain());}

}

}
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Ca ne réponds pas à ma question, je le sais ca, et je m'en arrange, je veux juste communiquer un message sur autre chose que le pointeur du MainForm qui peut etre null

<hr />I love .net
Messages postés
379
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
20 avril 2011
1
De rien.
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
11
salut,

tu pourrais avoir ta fenêtre principale cachée et utiliser les messages DDE pour être notifié des fichiers ouverts : http://www.csharpfr.com/codes/OUVRIR-DOCUMENTS-DANS-MEME-INSTANCE-APPLICATION-SANS-RELANCEMENT_41097.aspx

ShareVB