Un seul process avec notification de demande d'ouverture

cs_Yxion Messages postés 219 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 septembre 2009 - 14 nov. 2007 à 13:55
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 - 19 nov. 2007 à 23:59
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

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
14 nov. 2007 à 15:19
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)
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
14 nov. 2007 à 19:36
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-
0
cs_Yxion Messages postés 219 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 septembre 2009
15 nov. 2007 à 17:31
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
0
scortex84 Messages postés 379 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 20 avril 2011 1
19 nov. 2007 à 16:35
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());}

}

}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Yxion Messages postés 219 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 septembre 2009
19 nov. 2007 à 16:58
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
0
scortex84 Messages postés 379 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 20 avril 2011 1
19 nov. 2007 à 17:26
De rien.
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
19 nov. 2007 à 23:59
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
0
Rejoignez-nous