|
Trouver une ressource
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 !
INSTANCE UNIQUE + COMMUNICATION DE MESSAGES (COMPATIBLE 32 ET 64 BIT)
Information sur la source
Description
Cette DLL permet d'avoir une instance unique d'un programme en plus de permettre: 1. La communication de paramètres entre instances (condition: elles doivent être lancées par le même utilisateur) 2. Une fonction pour mettre la fenêtre de l'instance unique au premier plan. Cette fonction utilise quelques API windows et du code unsafe. Par contre, ce code a été vu pour être fonctionnel nativement autant sur une architecture 32 et 64 bits sans modifications. Elle utilise aussi un fichier projeté en mémoire pour permettre la communication inter-process.
Source
- /* Le ZIP contient le projet de la DLL puis un
- * projet d'exemple qui active les fonctionnalités
- * de communication.
- *
- * Étapes pour faire fonctionner l'application:
- *- Créer un SingleInstanceManager global pour
- * l'application dans Main en spécifiant un nom de
- * ressource unique.
- *- Vérifier IsFirstInstance.
- *
- * Lors de la création de la form principale (dans le
- * constructeur):
- *- Enregistrez-vous dans l'événement
- * InstanceMessageReceived, qui est nécessaire pour la
- * communication
- *- Appelez SetWindow(this), qui est nécessaire pour la
- * communication et FocusFirstInstance
- *- Surchargez WndProc pour appeler en premier
- * FilterMessage, ce qui permettra le déclenchement
- * des événements et de la communication.
- *
- * Pour obtenir la liste des messages en attente:
- * Appelez GetPendingInstanceMessages();
- *
- * Vous pouvez utiliser AreMessagesPending pour tester
- * la présence de messages.
- *
- * Ci-dessous un exemple partiel d'implémentation:
- */
- using System;
- using System.Windows.Forms;
- using Utils;
- public partial class FrmMain: Form
- {
- internal static SingleInstanceManager m_manager;
- protected override void WndProc(ref Message m)
- {
- m_manager.FilterMessage(ref m);
- base.WndProc(ref m);
- }
- public FrmMain()
- {
- m_manager.InstanceMessageReceived+=m_manager_IMR;
- m_manager.SetWindow(this);
- InitializeComponent();
- }
- void m_manager_IMR(object s,EventArgs e)
- {
- foreach(string message in m_manager.GetPendingInstanceMessages())
- MessageBox.Show(message);
- }
- /* On main le Main dans la classe de form pour l'exemple. */
- [STAThread]
- public static void Main(string[] args)
- {
- m_manager = new SingleInstanceManager("MON_NOM_uNiQuE_DE_RESSOURCE_Z94");
- if(m_manager.IsFirstInstance)
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new FrmMain());
- }
- else
- {
- m_manager.FocusFirstInstance();
- foreach(string arg in args)
- m_manager.SendInstanceMessage(arg);
- }
- }
- }
/* Le ZIP contient le projet de la DLL puis un
* projet d'exemple qui active les fonctionnalités
* de communication.
*
* Étapes pour faire fonctionner l'application:
*- Créer un SingleInstanceManager global pour
* l'application dans Main en spécifiant un nom de
* ressource unique.
*- Vérifier IsFirstInstance.
*
* Lors de la création de la form principale (dans le
* constructeur):
*- Enregistrez-vous dans l'événement
* InstanceMessageReceived, qui est nécessaire pour la
* communication
*- Appelez SetWindow(this), qui est nécessaire pour la
* communication et FocusFirstInstance
*- Surchargez WndProc pour appeler en premier
* FilterMessage, ce qui permettra le déclenchement
* des événements et de la communication.
*
* Pour obtenir la liste des messages en attente:
* Appelez GetPendingInstanceMessages();
*
* Vous pouvez utiliser AreMessagesPending pour tester
* la présence de messages.
*
* Ci-dessous un exemple partiel d'implémentation:
*/
using System;
using System.Windows.Forms;
using Utils;
public partial class FrmMain: Form
{
internal static SingleInstanceManager m_manager;
protected override void WndProc(ref Message m)
{
m_manager.FilterMessage(ref m);
base.WndProc(ref m);
}
public FrmMain()
{
m_manager.InstanceMessageReceived+=m_manager_IMR;
m_manager.SetWindow(this);
InitializeComponent();
}
void m_manager_IMR(object s,EventArgs e)
{
foreach(string message in m_manager.GetPendingInstanceMessages())
MessageBox.Show(message);
}
/* On main le Main dans la classe de form pour l'exemple. */
[STAThread]
public static void Main(string[] args)
{
m_manager = new SingleInstanceManager("MON_NOM_uNiQuE_DE_RESSOURCE_Z94");
if(m_manager.IsFirstInstance)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FrmMain());
}
else
{
m_manager.FocusFirstInstance();
foreach(string arg in args)
m_manager.SendInstanceMessage(arg);
}
}
}
Conclusion
J'espère que cette source saura vous combler et qu'elle vous montrera une autre méthode pour rendre une application en instance unique (et en pouvant lui transmettre des paramètres). Je tiens à mentionner que cette source est inspirée en grande partie du code de Paint.NET. Je l'ai isolée pour les besoins de la cause et j'ai essayé de commenter le mieux possible son fonctionnement. Pour clarifier, la communication est unidirectionnelle vers l'instance unique.
Historique
- 11 mars 2008 17:43:41 :
- Ajout d'un code d'exemple dans la boite de code.
Sources du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Communication entre 2 processus [ par mastar_trek ]
Bonjours à tous, j'aurai besoin de créer une interface pour regrouper un ensemble de traitements qui se font pour l'instant par une suite de scripts e
Communication inter-processus [ par ada3m0n666 ]
Bonjour bonjour,j'ai deux processus A et B. Le processus A s'exécute, lance le processus B qui execute quelques instructions puis se met en attente d'
Comment avoir une seule tâche pour toutes mes fenêtres? [ par churrros ]
Bonjour, Lorsque j'ouvre une Form2 depuis une Form1 je procède ainsi : Form2 InstanceForm2 = new Form2(); InstanceForm2.ShowDialog(); Donc je créé
ViewState [ par 24 ans ]
Salut tous le mondeJe débute en WebForm,j ai une petite questionj ai developpé une classe "Groupe" qui permet d'ajoutet un groupe dans la base de donn
Vérifier la présence d'un processus [ par olden ]
Bonjour, Je n'y connait rien en C#, et très peu en programmation (ce n'est pas mon job à la base) et j'ai besoin d'effectuer une surveillance de proce
Lancement de processus distant [ par olden ]
Bonjour, J'utilise le WMI afin delancer des process sur un poste distant, sauf que mon process apparait bien dans le gestionnaire des tâches, mais la
Mdi communication pb [ par Nicodelphi ]
Bonjour a tous voila j'ai un mdiparent avec lequelle j'ouvre une form2 enfant depuis cette form2 enfant j'ouvre une autre viaForm3 frm = new form3()fr
MySQL .data.dll thread en veille lors du close de l'instance [ par oleronpower ]
Bonjour à tous,J'utilise la dll de connexion à MySQL en c#La version est la 5.1.2.2, j'arrive à créer une instance :SQLConnection toto= new SQLConnect
ListBox : différencier l'item de son texte [ par memorial76 ]
j'ai créé une listeBox dans laquelle je stock des instances d'objets mais je voudrais que n'apparaisse dans cette dernière uniquement la variable stri
[ASP.NET 2.0] Probleme ouverture d'un fichier ... [ par notoriousFab ]
Bonjour à tous , J'ai cree un site internet qui gère des résultats de joueurs de tennis. Sur ce site, il faut pouvoir envoyer un mail aux responsables
|
Téléchargements
Logiciels à télécharger sur le même thème :
|