Application ne pouvant être lancé qu'une seule fois

Soyez le premier à donner votre avis sur cette source.

Vue 11 462 fois - Téléchargée 923 fois

Description

C'est un exemple d'application qui ne peux pas se lancer plusieurs fois,
c'est à dire qu'au démarrage de l'application, grâce à un Mutex, elle détecte si c'est la première instance
Si c'est le cas, elle lance sa fenêtre principale
Sinon, elle envoi un message windows personnalisé pour transmettre les arguments de sa ligne de commande
et pour indiquer à la première instance qu'elle doit s'activer (se rendre visible)

C'est pas évident à expliquer, donc je vous invite à regarder le code qui est bien commenté

Source / Exemple :


Liste des importations d'API utilisés

// Permet d'envoyer un message windows sans attendre sa réception
[DllImport( "user32.dll" )]
private static extern int PostMessageA( IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam );

// Permet de récupérer un numéro de message personnalisé unique
[DllImport( "user32.dll" )]
internal static extern int RegisterWindowMessage( StringBuilder lpString );

// Permet d'ajouter une chaîne de caractères dans la table des Atomes globaux
[DllImport( "kernel32.dll" )]
internal static extern int GlobalAddAtom( StringBuilder lpString );

// Permet de récupérer la valeur d'un Atome global
[DllImport( "kernel32.dll" )]
internal static extern int GlobalGetAtomName( int atomID, StringBuilder lpString, int nSize );

// Permet de supprimer un Atome global
[DllImport( "kernel32.dll" )]
internal static extern int GlobalDeleteAtom( int atomID );

// Permet de récupérer le handle de la fenêtre de l'application
[DllImport( "user32.dll" )]
internal static extern IntPtr FindWindow( string className, string formName );

Conclusion :


Jeter un coup d'oeil dans la class Program ( celle qui contient la méthode Main )
C'est ici que je teste si une instance de l'application est déjà ouverte
Tout simplement pour éviter d'ouvrir une deuxième fenêtre...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
46
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
30 septembre 2010

C'etait juste une remarque de modélisation.

Le singleton permet l'unicité d'une entité (donc d'un processus, d'une instance, d'un objet, d'une IHM etc...). Il peut donc s'ppliquer partout. Je notais juste cette remarque pour que tu le note peut etre en commentaire dans le code ;-)

Ceci dit je salue ton source qui attaque des dll intéressantes de l'OS windows...Très bonne initiative et de bons commentaires très utiles..

Merci pour ton partage de connaissance
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
6
Non non RichLeKebekoi, tu n'te trompes pas ;)
Messages postés
303
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
24 avril 2009
5
A moins que je ne me trompe, le singleton ne s'étendra pas au dela d'un meme processus. Hors ici il est question de ne pas redémarrer un 2e processus de l'application si un est deja ouvert, comme Windows Live Messenger par exemple.
Messages postés
46
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
30 septembre 2010

Et le design pattern < singleton > ?
Messages postés
15
Date d'inscription
lundi 30 août 2004
Statut
Membre
Dernière intervention
11 février 2008

A quoi sert ton Mutex si ton FindWindow fonctionne ?
je sais je titille un peu la ...
Afficher les 13 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.