Réactiver l'instance d'un programme déjà ouvert lorsque qu'on souhaite le réexéc

Picsonald Messages postés 23 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 7 novembre 2020 - 3 mars 2011 à 11:55
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 - 7 mars 2011 à 11:04
Salut à tous !

J'ai un programme dont l'exécution multi-instance sur une session donnée est interdite. C'est-à-dire que si deux utilisateurs sont connectés sur l'ordinateur, chacun d'eux a le droit d'ouvrir une seule instance du programme.

J'y suis parvenu en utilisant les Mutex. Concrètement, dans la méthode 'Main' de la classe 'Program.cs' (using System.Threading) :
Mutex _mutex = new Mutex(false, "Pcs" + Application.ProductName);
Boolean _tourneDéjà = !_mutex.WaitOne(0, true);
if (!_tourneDéjà)
{
    // Ouverture de la fenêtre principale.
    _mutex.ReleaseMutex();
}
else
{
    MessageBox.Show("Ce programme est déjà en cours d'exécution.");
}

Une autre solution était possible en parcourant la liste des processus (using System.Diagnostics). Mais bon, c'était un peu lourdingue, car il me fallait également contrôler l'utilisateur (_process.ProcessStratInfo.UserName).


Mon objectif est maintenant de faire en sorte que, lorsque l'utilisateur tente d'exécuter mon application une seconde fois (c'est-à-dire qu'elle est déjà lancée) alors, non seulement elle ne se rouvre pas, mais en plus, elle met l'autre application au premier plan.

Finalement, le comportement serait le même que celui de Windows Live Messenger. S'il est déjà en cours d'exécution, il ne se rouvre pas : il ne fait que réafficher la fenêtre principale du programme.


Auriez-vous une idée pour que ceci fonctionne ? (je bosse en C#, Winform, VS2008) ?


Merci d'avance !

Pics'

1 réponse

cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
7 mars 2011 à 11:04
Bonjour,
Voilà ce que j'ai utilisé comme code , à toi de l'adapter :
/// <summary>
/// Utility to create one instance of an application.
/// If Exist switch to running application
/// </summary>
public static class WpfSingleInstance
{
/// <summary>
/// Test if event exist and create it if not exist.
/// </summary>
///


///


internal static void Make(String name, Application app)
{

EventWaitHandle eventWaitHandle = null;
String eventName = Environment.MachineName + "-" + Environment.CurrentDirectory.Replace('\\', '-') + "-" + name;

bool isFirstInstance = false;

try
{
eventWaitHandle = EventWaitHandle.OpenExisting(eventName);
}
catch
{
// it's first instance
isFirstInstance = true;
}

if (isFirstInstance)
{
eventWaitHandle = new EventWaitHandle(
false,
EventResetMode.AutoReset,
eventName);

ThreadPool.RegisterWaitForSingleObject(eventWaitHandle, waitOrTimerCallback, app, Timeout.Infinite, false);

// not need more
eventWaitHandle.Close();
}
else
{
eventWaitHandle.Set();

// For that exit no interceptions
Environment.Exit(0);
}
}

/// <summary>
/// Callback for application for switching from an other startup
/// </summary>
///


///


private static void waitOrTimerCallback(Object state, Boolean timedOut)
{
Application app = (Application)state;
app.Dispatcher.BeginInvoke(new activate(delegate()
{
Application.Current.MainWindow.Activate();
}), null);
}


private delegate void activate();

}

Bon codage


louis
0
Rejoignez-nous