2011-04-11 3 views
4

Pour empêcher l'utilisateur d'exécuter plusieurs instances de mon application, je me sers de ce code: -identification propre nom de processus en C#

Process[] pArry = Process.GetProcesses(); 
      int nCount = 0; 
      foreach (Process p in pArry) 
      { 
       string ProcessName = p.ProcessName; 
       ProcessName = ProcessName.ToLower(); 
       if (ProcessName.CompareTo("myApp") == 0) 
       { 
        nCount++; 
       } 
      } 
      if (nCount > 1) 
      { 
       MessageBox.Show(AppAlreadyRunning,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error); 
       Process.GetCurrentProcess().Kill(); 
      } 

Mais comme nous le savons, les changements processus de nom si modifier le nom exe. Donc, si l'utilisateur change "myApp.exe" en "UserApp.exe", ce correctif ne fonctionnera pas! Y a-t-il un moyen de s'en sortir? J'utilise C# dans VS2010. Merci!

Répondre

4
+0

Merci .... Bien que j'ai cherché d'abord, je ne pouvais pas le trouver ... Ce fil est vraiment utile! – Swanand

+0

L'utilisation +1 d'une construction en mode noyau telle que mutex est certainement la meilleure façon de le faire (bien que l'utilisation d'un sémaphore ait légèrement moins de frais généraux). Il est facile de changer le nom du processus d'une seconde instance pour éviter une vérification qui repose sur les noms de processus. –

7

Ceci est un processus très simple. L'appel de cette fonction renvoie une classe de processus avec toutes les informations dont vous avez besoin.

Process.GetCurrentProcess() 

Voici du code pour vous.

 Process[] pArry = Process.GetProcesses(); 
     foreach (Process p in pArry) 
     { 
      if (p.Id == Process.GetCurrentProcess().Id) 
       continue; 
      string ProcessName = p.ProcessName; 
      if(ProcessName == Process.GetCurrentProcess().ProcessName) 
      { 
       MessageBox.Show(AppAlreadyRunning,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error) 
       SetForegroundWindow(p.MainWindowHandle); 
       Application.Exit(); 
      } 
     } 
+1

@Swanand Purankar: bien que cela ne répond à votre question, vous devriez vraiment regarder à l'aide d'une construction en mode noyau pour le faire. Même si vous vérifiez les noms de processus, il est facile pour un utilisateur de faire plusieurs copies de votre exe avec un nom différent. Dans ce cas, la vérification de votre nom de processus n'empêcherait pas l'utilisateur d'exécuter simultanément tous les exe. –

+0

@AdamRalph Bien que je réponde presque après un an et demi, je me souviens, j'ai aussi utilisé Mutex ... Merci à votre commentaire !! :) – Swanand

1

Je parie que vous pouvez utiliser Process.GetCurrentProcess() (comme vous le faites pour tuer le processus) pour obtenir le nom réel et l'utiliser pour la comparaison.

Questions connexes