2009-07-30 7 views
12

Bon, alors j'ai créé mon application C#, créé un programme d'installation pour cela et je l'ai installé sur ma machine.Restreindre plusieurs instances d'une application

Le problème est que lorsque l'utilisateur ouvre l'application exe deux fois, il y aura deux instances de l'application en cours d'exécution. Je veux seulement qu'une instance de l'application soit exécutée à tout moment, comment puis-je faire cela?

Merci pour votre aide,

Répondre

9

La technique courante est de créer un nom Mutex et vérifier sa présence au démarrage de l'application.

Voir this ou this.

code de DDJ:

class App : Form 
{ 
    Mutex mutex; 

    App() 
    { 
     Text = "Single Instance!"; 
     mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX"); 
     if (!mutex.WaitOne(0, false)) 
     { 
      mutex.Close(); 
      mutex = null; 
     } 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
      mutex.ReleaseMutex(); 
     base.Dispose(disposing); 
    } 

    static void Main() 
    { 
     App app = new App(); 
     if (app.mutex != null) Application.Run(app); 
     else MessageBox.Show("Instance already running"); 
    } 
} 
+0

S'il vous plaît montrer le code en réponse. Le premier lien était mort et d'autres pourraient éventuellement suivre. – nothingisnecessary

0

Je ne sais pas l'environnement que vous utilisez, mais quelque chose à garder à l'esprit au sujet des « applications instance unique » est de savoir comment vous définissez une seule instance. Si l'application peut être exécutée sur plusieurs stations de travail en même temps, en utilisant une source de données commune, est-ce un problème? De même, qu'en est-il de la situation d'un service terminal (ou d'une situation "exécutée") où plus d'un utilisateur est connecté au même ordinateur, voulez-vous restreindre l'application de telle sorte qu'une seule instance par utilisateur, par -ordinateur? Ou êtes-vous d'accord avec cela étant simplement une instance par utilisateur?

La réponse à ceux-ci pourrait vous conduire dans une direction plutôt qu'une autre. Par exemple, nous avons une application 'instance unique' dont la portée est un groupe d'ordinateurs. Un seul utilisateur est autorisé sur ce groupe de stations de travail. Nous avons géré cela en ayant une table dans notre source de données partagée qui suivait les utilisateurs actuellement connectés. C'est un problème de maintenance car vous devez vous assurer que la table est précise à 100% tout le temps. Manipuler des choses comme des coupures de courant inattendues sur le poste de travail, en laissant des enregistrements «fictifs» dans cette table a pris une manipulation prudente.

4

Merci à Messrs.Allen et Powell:

static void Main() 
    { 
     using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) { 
      if (!mutex.WaitOne(0, false)) { 
       string processName = GetProcessName(); 
       BringOldInstanceToFront(processName); 
      } 
      else { 
       GC.Collect(); 
       Application.Run(new Voting()); 
      } 
     } 
    } 

    private static void BringOldInstanceToFront(string processName) { 
     Process[] RunningProcesses = Process.GetProcessesByName(processName); 
     if (RunningProcesses.Length > 0) { 
      Process runningProcess = RunningProcesses[0]; 
      if (runningProcess != null) { 
       IntPtr mainWindowHandle = runningProcess.MainWindowHandle; 
       NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED); 
      NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE); 
      } 
     } 
    } 
+0

L'affichage du code semble être rejeté par le @ "Global" - mes excuses. – lance

8

i résolu ce problème en ce

[STAThread] 
static void Main() 
    { 

     Process[] result = Process.GetProcessesByName("ApplicationName"); 
     if (result.Length > 1) 
     { 
      MessageBox.Show("There is already a instance running.", "Information"); 
      System.Environment.Exit(0); 
     } 
     // here normal start 
    } 

il est simple, mais j'eu à peine le temps de vérifier les meilleures solutions.

+0

Si quelqu'un prend une copie de l'application sous un nom différent et commence comme un nouveau processus, il y aura plusieurs instances. Donc utilisez les champs 'processObject.MainModule.FileInfo' comme la description ou le nom du fichier original ... qui ne change pas même si le fichier exécutable est renommé – Sanjay

Questions connexes