begin process at 2012 02 08 03:55:10
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :8 978 / 503

Auteur : LUDINSKI

Ecrire un message privé
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

Les Membres Club peuvent 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...

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) EXEMPLE ILLUSTRANT COMMENT FAIRE UNE ANIMATION COMPOSÉE D'IM...
Source avec Zip Source avec une capture Source .NET (Dotnet) SUITE À MON MESSAGE : CONVERSION ISO-8859-1 EN UTF8
Source avec Zip Source avec une capture Source .NET (Dotnet) LECTEUR/ENREGISTREUR DE RADIOS INTERNET, DESSIN DYNAMIQUE DA...
Source avec Zip Source avec une capture Source .NET (Dotnet) CLASSE PERMETTANT DE MODIFIER LES PARAMÈTRES DU FIREWALL DE ...
Source avec Zip Source avec une capture Source .NET (Dotnet) CLASSE PERMETTANT DE DÉPLACER UN CONTRÔLE SUR UN FORMULAIRE ...

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) GETSYSTEMTIME ET SETSYSTEMTIME par Arnotic
Source avec Zip Source avec une capture Source .NET (Dotnet) [SILVERLIGHT] UN GÉNÉRATEUR INTERACTIF D'ARBRES DE HUFFMAN par loudadyassine
Source avec Zip Source .NET (Dotnet) [C#2008] OBSERVER L'ACTIVITÉ INPUT (CLAVIER SOURIS) DE L'UTI... par PCPT
Source avec Zip Source avec une capture Source .NET (Dotnet) UTILISATION DE L'API VIRTUAL DISK IMAGE DE WINDOWS 7 par Willi
Source avec Zip Source .NET (Dotnet) CHESS GAME CORE - LIBRAIRIE JEU D'ÉCHEC EN C# par Bidou

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) MECANISME DE SYNCHRONISATION DE THREAD - MONITOR, MUTEX, SEM... par jesusonline
Source avec Zip Source .NET (Dotnet) UNE SEULE INSTANCE DE L'APPLICATION par keikun59
Source avec Zip Source avec une capture Source .NET (Dotnet) IMESSAGEFILTER : ÉVÉNEMENTS MOUSEMOVE / MOUSEENTER / MOUSELE... par coq
Source avec Zip Source avec une capture Source .NET (Dotnet) CLASSE PERMETTANT DE DÉPLACER UN CONTRÔLE SUR UN FORMULAIRE ... par LUDINSKI
Source .NET (Dotnet) IMESSAGEFILTER - EXEMPLE D'UTILISATION D'UN FILTRE DE MESSAG... par coq

Commentaires et avis

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

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.

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

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

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

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.

Commentaire de ricklekebekoi le 18/04/2007 20:45:35

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

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

très interessant

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

Commentaire de ecosmose le 15/12/2007 16:10:42

Et le design pattern < singleton > ?

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.

Commentaire de LUDINSKI le 15/12/2007 18:50:04

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

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 [C#] MultiThread Cross [ par Hurin ] Bonjour, J'ai une application possédant une classe gérant l'accès aux bases de données via les méthodes open(), close(), read() et write() (il y en a SendMessage ou PostMessage et Mozilla Firefox [ par KroOon ] Je sait j'utilise un code totalement Pollué .. je m'y retrouve et sa marche ! c'est le principal.. :p Alors Voila .. je souhaite interagir avec un O SendMessage Ou PostMessage Mozilla [ par KroOon ] Bonjour, Voila j'aimerais avec un SendMessage ou un PostMessage simuler un clik tout simple sur le bouton "Recherche Google" ( Pour effectuer une rech instruction postmessage [ par wabtoresv ] Bonjour je suis noob en C#, j'ai dejas programmé en vb et php. Je cherche la facon la plus efficace pour simuler un clavier virtuel. En effet j'en Réactiver l'instance d'un programme déjà ouvert lorsque qu'on souhaite le réexécuter [ par Picsonald ] Salut à tous ! J'ai un programme dont l'exécution multi-instance sur une session donnée est interdite. C'est-à-dire que si deux utilisateurs sont con Comportement étrange d'un Mutex [ par cedricbi ] Bonjour à tous, Je ne comprend pas pourquoi cette fonction ne met pas 100 secondes pour s'exécuter. Le thread n'est-il pas l'équivalent d'un Semaphor


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,622 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales