PreviousIstance di una applicazione

di il
7 risposte

PreviousIstance di una applicazione

Ma in C# come si fa a capire che una applicazione è già in esecuzione? In C conoscevo il metodo PreviousInstance in C# come si fà?

7 Risposte

  • Re: PreviousIstance di una applicazione

    Ciao ItaloPasi,
    La cosa più semplice è creare un mutex con il nome della tua applicazione, ad esempio:
    
    private static Mutex SingleInstanceMutex;
    ...
    
    public static bool IsAlreadyRunning(string mutexName)
    {
        bool created;
        SingleInstanceMutex = new Mutex(true, mutexName, out created);
        return created == false;
    }
    ...
    
    if (IsAlreadyRunning("MyApplicationName"))
       ...
    
    
    Se il mutex è già stato creato da una istanza precedente della tua applicazione la nuova creazione fallisce.
  • Re: PreviousIstance di una applicazione

    A ben pensarci non è necessario dichiarare una variabile globale, puoi fare:
    
    public static bool IsAlreadyRunning(string mutexName)
    {
        bool created;
        Mutex mutex = new Mutex(true, mutexName, out created);
        GC.KeepAlive(mutex);
        return created == false;
    }
    
    ...
    
    if (IsAlreadyRunning("MyApplicationName"))
       ...
    
    
    Cosi mi sembra più comodo.
  • Re: PreviousIstance di una applicazione

    Quindi se la crazione del mutex fallisce vuol dire che l' applicazione esiste già, per cui chiudo la seconda applicazione e mi piacerebbe portare in primo piano la prima. Come faccio a fare questo? In C++ usavo SetForegroundWindow in C# come si fà?
  • Re: PreviousIstance di una applicazione

    Semplice basta usare SetForegroundWindow.

    In C# puoi richiamare tutte le API di Window, devi prima dichiararne il prototipo in questo modo:
    
    [DllImport("user32.dll")]
    public static extern bool SetForegroundWindow(IntPtr hWnd);
    
    e poi usarla passandole l' id del processo da portare in primo piano.
  • Re: PreviousIstance di una applicazione

    Chiaro, però io so come ottenere l' handle della applicazione corrente:
    
    Process currentProcess = Process.GetCurrentProcess();
    IntPtr handle = process.MainWindowHandle;
    
    Ma l' applicazione che devo portare in primo piano è l' altra non la mia (che voglio chiudere).
    Ho anche pensato di usare Process.GetProcessesByName, ma il problema è che entrambe le applicazioni hanno lo stesso nome. Non so se mi sono spiegato, non riesco ad avere l' handle dell' altra applicazione.
  • Re: PreviousIstance di una applicazione

    Ecco qua:
    
    public static bool IsAlreadyRunningAndForeground(string mutexName)
    {
         if (IsAlreadyRunning(mutexName))
         {
              Process currentProcess = Process.GetCurrentProcess();
              foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
              {
                   if (process.Id != currentProcess.Id)
                   {
                         SetForegroundWindow(process.MainWindowHandle);
                         break;
                   }
               }
               return true;
         }
        return false;
    }
    
    In pratica prima ottieni l' handle dalla tua applicazione, poi quando cicli con Process.GetProcessesByName escludi l' applicazione col tuo handle, l' altra (saranno solo due) è quella che devi portare in primo piano.
  • Re: PreviousIstance di una applicazione

    Ok grazie, ti meriti una
Devi accedere o registrarti per scrivere nel forum
7 risposte