2010-02-04 7 views
4

J'ai essayé le code en utilisant mutex mais je suis incapable d'ouvrir mon exe après le clic du bouton im réussie en ne faisant pas les multiples entrées de l'application sur la barre des tâches au clic de bouton mais mon application est lancée seulement quand je ferme mon formulaire. Je veux lancer mon application en cliquant sur le bouton et si l'application est déjà lancée, je dois me concentrer sur l'application précédente. comment pourrais-je résoudre mon besoin de lancer et de me concentrer de nouveau et de rouvrir l'application? .. im envoyer u mon code im en utilisant un événement bouton clic et plz modifier mes erreurs ...comment définir le focus et lancer l'application déjà en cours sur l'événement de clic sur le bouton dans C# .net3.5?

codage à Program.cs

static void Main() 
{ 

    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 

    Application.Run(new Form1()); 
    System.Diagnostics.Process.Start("filename.exe"); 
} 

:

codage fait à form1.cs

private void button1_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     bool createdNew; 
     Mutex m = new Mutex(true, "e-Recording", out createdNew); 
     System.Diagnostics.ProcessStartInfo f = new System.Diagnostics.ProcessStartInfo("C:\\windows\\system32\\rundll32.exe", "C:\\windows\\system32\\shimgvw.dll,ImageView_Fullscreen " + "filename.exe".TrimEnd(null)); 

     if (createdNew) Launch(); 

     else 
     { 
      MessageBox.Show("e-Recording is already running!", "Multiple Instances"); 
     } 
    } 
    catch (Exception ex) 
    { 
      System.Diagnostics.Debug.WriteLine(ex.ToString()); 
    } 
} 

Répondre

3

C'est en mesure de trouver et de passer à un processus déjà en cours qui correspond à ce que vous essayez de démarrer.

[DllImport("user32.dll")] 
public static extern bool ShowWindowAsync(HandleRef hWnd, int nCmdShow); 
public const int SW_RESTORE = 9; 

public void SwitchToCurrent() { 
    IntPtr hWnd = IntPtr.Zero; 
    Process process = Process.GetCurrentProcess(); 
    Process[] processes = Process.GetProcessesByName(process.ProcessName); 
    foreach (Process _process in processes) { 
    // Get the first instance that is not this instance, has the 
    // same process name and was started from the same file name 
    // and location. Also check that the process has a valid 
    // window handle in this session to filter out other user's 
    // processes. 
    if (_process.Id != process.Id && 
     _process.MainModule.FileName == process.MainModule.FileName && 
     _process.MainWindowHandle != IntPtr.Zero) { 
     hWnd = _process.MainWindowHandle; 

     ShowWindowAsync(NativeMethods.HRef(hWnd), SW_RESTORE); 
     break; 
    } 
    } 
} 
+0

Qu'est-ce que la méthode NativeMethods.HRef (hWnd)? – oopsdazie

1

J'ai posté une réponse un certain temps à une question sur Delphi. J'ai expliqué que je n'avais pas d'expérience dans Delphi mais j'ai décrit à un niveau élevé ce que j'ai fait en C# pour construire un composant qui utilise la communication InterProcess (IPC) avec .NET Remoting pour non seulement activer une instance en cours, mais aussi avancer les paramètres de ligne de commande de la deuxième instance dans la première instance. J'ai lié à un composant assez simple à utiliser qui enveloppe toutes ces fonctionnalités. Cela peut vous être utile.

Hers est ma réponse de la other question:

La meilleure façon de le faire est en fait en le code de démarrage de votre exe. En d'autres termes, laissez Explorer lancer une deuxième copie de l'exe qui alors procède à la détection qu'il est déjà en cours d'exécution et qu'il envoie un message à l'instance en cours d'exécution.

Personnellement, je n'ai pratiquement aucune expérience avec Delphi, mais la façon dont je l'ai fait dans une application .NET était en utilisant un mutex et un canal de communication interprocessus .

L'idée générale était que la première instance de l'application serait début et commencer à écouter sur un canal IPC . Il créerait également un mutex interprété . Lorsque la seconde instance lancée, il serait impossible pour créer le mutex du même nom qui signifiait qu'une instance précédente était en cours d'exécution et d'écoute pour les appels sur le canal IPC . La deuxième instance a ensuite envoyé les arguments de ligne de commande à la première instance sur IPC et la première instance a pris l'action sur eux. La seconde instance quitte alors sans affichant une interface utilisateur.

J'ai téléchargé le code pour ce composant (C#) et le lien est ci-dessous. Je ne crois pas qu'il a des dépendances externes et je ne sais pas ce que le mécanisme de communication équivalent dans Delphi serait - mais j'espère que ce vous donne quelques idées.

InstanceManager Component (C#)

+0

merci pour ur réponse ...... comme im nouveau pour DELPHI donc je ne pouvais pas comprendre le code .. c'est pourquoi j'ai besoin le code C# .net – zoya

+0

je pense que vous avez mal compris ce que je disais .. Le code * est * en C# mais la question de l'autre personne concernait Delphi. Je n'utilise pas Delphi non plus. – Josh

+0

Pouvez-vous s'il vous plaît fournir à nouveau l'échantillon? Je vous remercie! Je cherche désespérément cette solution exacte. – oopsdazie

0

Notez que l'utilisation de mutex nommés est déconseillée pour des raisons de sécurité. Tout processus (même s'il est exécuté sous un compte invité) peut créer un mutex avec le même nom avant le démarrage de votre processus. Résoudre ces problèmes de sécurité est généralement plus difficile que de ne pas utiliser de mutex nommé du tout. Pour résoudre votre problème, il vous suffit de stocker le gestionnaire de processus ou l'ID du processus, puis de rechercher une fenêtre avec cet ID de processus. Ceci est similaire au fonctionnement du gestionnaire de tâches.

Questions connexes