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

Soyez le premier à donner votre avis sur cette source.

Vue 11 298 fois - Téléchargée 850 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

ricklekebekoi
Messages postés
303
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
24 avril 2009
4 -
Cela semble être ce que j'essai désespéremment de faire depuis quelques jours :) Est-ce que ça fonctionne si l'appli est dans le systray (NotifyIcon + Hide() + ShowInTaskbar:False + WindowState:Minimized) ??
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29 -
Pour la ligne de commande tu pouvais passer par le message WM_COPYDATA.
LUDINSKI
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
6 -
Salut ricklekebekoi,
Je suis justement en train de m'en occuper...

Lutinor, c'est vrai que je n'y avait pas pensé.
Je vais voir...
LUDINSKI
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
6 -
Voilà Rick..,
Je pense que tu trouveras ton bonheur la dedans

Pour recevoir les messages même quand la fenêtre est dans le systray, j'ai dû passer par l'interface IMessageFilter; WndProc lui, ne récupère plus les messages dans ce cas...
(c'est tout à fait normal d'ailleur !)

Lutinor, j'ai regardé de plus près le message WM_COPYDATA, mais je ne l'implémenterai pas : J'ai pas envie de me battre avec les allocations de mémoires non managés, surtout en passant par un tableau...

Par contre, si tu as un exemple d'utilisation dans un cas similaire, je suis preneur ^^

Voilà, bonne prog à tous...
ricklekebekoi
Messages postés
303
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
24 avril 2009
4 -
Un gros merci pour cette source, je prendrai le temps de la regarder ce week-end :)

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.