Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

APPLICATION NE POUVANT ÊTRE LANCÉ QU'UNE SEULE FOIS


Information sur la source

Catégorie :API Source .NET ( DotNet ) Classé sous : postmessage, globalatom, wmuser, mutex, imessagefilter Niveau : Initié Date de création : 12/04/2007 Date de mise à jour : 13/04/2007 14:05:42 Vu / téléchargé: 6 282 / 340

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
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

  • 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 );
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...
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

13 avril 2007 14:05:43 :
J'utilise l'interface IMessageFilter plutôt que la méthode WndProc Si j'avais utilisé WndProc, l'application ne recevait pas de message lorsqu'elle était cachée Maintenant la fenêtre se met dans le systray lorsqu'on la ferme et si on tente d'ouvrir une autre instance, elle se réactive...

Commentaires et avis

signaler à un administrateur
Commentaire de ricklekebekoi le 12/04/2007 15:35:41

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) ??

signaler à un administrateur
Commentaire de Lutinore le 12/04/2007 16:47:43 administrateur CS

Pour la ligne de commande tu pouvais passer par le message WM_COPYDATA.

signaler à un administrateur
Commentaire de LUDINSKI le 12/04/2007 17:43:15

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...

signaler à un administrateur
Commentaire de LUDINSKI le 13/04/2007 14:12:50

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...

signaler à un administrateur
Commentaire de ricklekebekoi le 13/04/2007 14:14:50

Un gros merci pour cette source, je prendrai le temps de la regarder ce week-end :)

signaler à un administrateur
Commentaire de Lutinore le 13/04/2007 17:04:14 administrateur CS

Ludinski, un exemple de WM_COPYDATA

http://www.csharpfr.com/infomsg_OUVRIR-FICHIER-AVEC-SON-APPLICATION_889845.aspx

J'utilise du code unsafe mais tu peux facilement t'en passer.

signaler à un administrateur
Commentaire de ricklekebekoi le 18/04/2007 20:45:35

Simplement, juste un merci pour confirmer que tout fonctionne :)

signaler à un administrateur
Commentaire de Alain Proviste le 18/04/2007 22:57:17 administrateur CS

très interessant

signaler à un administrateur
Commentaire de oliteine le 06/09/2007 15:22:18

A quoi sert ton Mutex si ton FindWindow fonctionne ?
je sais je titille un peu la ...

signaler à un administrateur
Commentaire de ecosmose le 15/12/2007 16:10:42

Et le design pattern < singleton > ?

signaler à un administrateur
Commentaire de ricklekebekoi le 15/12/2007 16:43:27

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.

signaler à un administrateur
Commentaire de LUDINSKI le 15/12/2007 18:50:04

Non non RichLeKebekoi, tu n'te trompes pas ;)

signaler à un administrateur
Commentaire de ecosmose le 16/12/2007 15:27:58

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Synchroniser l'envoi et la réception [ par fregolo52 ] Bonjour,J'essaie de de faire une sorte de Send/Receive synchrone.J'utilise les mutex, mais je ne comprends pas pourquoi il ne se met pas en attente d' FlashWindow ? [ par Elxior ] Bonsoir à tous, je suis présentement en train de programmer une nouvelle barre de tâche pour Windows XP / Vista, et j'ai un seul problème que je ne su


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,312 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.