EMPECHER UNE APPLIC. DE SE LANCER 2 FOIS

Signaler
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Messages postés
22
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
27 janvier 2012
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/20698-empecher-une-applic-de-se-lancer-2-fois

Messages postés
22
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
27 janvier 2012

Bonjour à tous, quelqu'un pourrait il m'aider a reformuler cette fonction pour mon application en C++, avec mes modifs mon appli ne se lance plus . je suis novice en programmation, Merci d'avance pour votre aide.
voila ou j'en suis:
Process^ Proc_EnCours = gcnew Process;
Proc_EnCours = Process::GetCurrentProcess();
array^Les_Proc = Process::GetProcesses();
for each (Process^ processus in Les_Proc);
if (Proc_EnCours->ProcessName == processus->ProcessName)
{MessageBox::Show("Le programme ne peut pas être lancé 2 fois!");
this->Close();
}
else
{
///////
}
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
80
Salut,

Tu vas devoir passer par un mécanisme d'IPC (Interprocess Communications).
- Remoting
- message Windows "perso" que tu traites par un filtre ou la méthode WndProc (voir WM_APP, WM_USER)
- Data Copy (WM_COPYDATA)
- etc : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ipc/base/interprocess_communications.asp)

Bon courage :-)
Messages postés
216
Date d'inscription
dimanche 13 janvier 2002
Statut
Modérateur
Dernière intervention
7 novembre 2009

bonjour,
Je sais regarder si mon appli est déjà lancée, mais il manque quand même quelquechose dans vos sources :)
J'ai une application de type NOTEPAD mais en MDI. J'empêche donc que mon application démarre deux fois, mais .... dans le cas ou celle-ci est démarrée, je voudrais lui demander de charger le nouveau fichier TXT que j'envois dans le Args[]

Avez vous une solution pour lancer une procédure dans le process qui est déjà lancé ?

Amicalement,
Messages postés
412
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
13 août 2007

string mutName = "87939A67-2893-470D-82EF-45A525BB31AB";

bool isNew = false;
Mutex mut = new Mutex(false, mutName,out isNew);

if (!isNew) return;

Application.Run(new Form1());
Messages postés
412
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
13 août 2007

Les mutex c'est quand même mieux pour voir si l'appli est déjà démarrée.. Tu y fous un GUID, et t'as vraiment quasiment aucune chance que ça prenne un programme pour un autre.
Messages postés
100
Date d'inscription
lundi 21 février 2005
Statut
Membre
Dernière intervention
18 février 2009

il manque un P

Process[] RunningProcesses = process.GetProcessesByName("MonAppli");
Messages postés
100
Date d'inscription
lundi 21 février 2005
Statut
Membre
Dernière intervention
18 février 2009

Un bout de code à améliorer mais qui permet de mettre en premier plan l'appli si elle est déjà lancer
je parle icid'une appli autre que le Form actif

private const int SW_MINIMIZE = 6;
private const int SW_RESTORE = 9;
//Je me suis battu pour savoir quelles constantes il fallait utiliser
//suivant que l'appli est derrière une fenêtre ou dans la barre des tâche

private void button1_Click(object sender, EventArgs e)
{
Process[] RunningProcesses = rocess.GetProcessesByName("MonAppli");
//MonAppli est le nom de l'exe sans .exe
if (RunningProcesses.Length != 1)
{
Process.Start(@"Chemin complet de l'appli");
}
else
{
ShowWindowAsync(RunningProcesses[0].MainWindowHandle,SW_SHOWMINIMIZED);
ShowWindowAsync(RunningProcesses[0].MainWindowHandle, SW_RESTORE);
}
}
[DllImport("User32.dll")]
public static extern int ShowWindowAsync(IntPtr hWnd, int nCmdShow);


@+
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
80
En te servant de la méthode des API Win "ShowWindow" (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/showwindow.asp) avec la commande "SW_MAXIMIZE" sur le Handle de la fenetre principale de l'appli en question ça doit probablement être faisable.
Messages postés
32
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
22 août 2005

Un très bon code, et surtout très utile. N'y aurait-il pas moyen de maximiser la fenêtre déjà existante au lieu d'afficher une dialog box?
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

public class MainForm : System.Windows.Forms.Form
{
static private Mutex g_Mutex;
[STAThread]
static void Main()
{
try
{
g_Mutex = new Mutex(true, "MyMutex");
if (g_Mutex.WaitOne(0,false))
{
// Do the job
}
}
catch (Exception e)
{
}
}
}
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
80
le pb reste entier : un process portant le même nom n'est pas forcement une instance de ton appli (nomme ton appli notepad.exe, lance le bloc note et essaie de lancer ton appli)

un exemple pour les mutex : http://www.thecodeproject.com/csharp/cssingprocess.asp
Messages postés
1
Date d'inscription
vendredi 3 décembre 2004
Statut
Membre
Dernière intervention
16 décembre 2004

J'utilise un code qui fonctionne sur mon application et qui n'e m'a jamais fait défaut. Il s'agit donc bien de ce protéger contre un deuxième appel de l'exe.
/// <summary>
/// Entry point of the application
/// </summary>
///


public static void Main(string[] Args)
{
// Check if an instance of the application is in progress
if (AppInstanceInProgress())
{
MessageBox.Show("You have an other programm still open. You must run juste ONE at a time.", "Programm Duplicate", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); //***NEW V1.31***
return;
}

try
{
...

/// <summary>
/// Check if a instance of the application is already in progress
/// </summary>
/// <returns></returns>
public static bool AppInstanceInProgress()
{
// Store the current process
Process lproCurrentProcess = Process.GetCurrentProcess();

// Check if the application is already loaded
if (Process.GetProcessesByName(lproCurrentProcess.ProcessName).Length > 1)
{
return true;
}
else
{
return false;
}
return false;
}
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

C'est un poil plus court mais ca reste dans l'esprit du début du topic :

static void Main()
{
Process ThisProcess = Process.GetCurrentProcess();
Process [] AllProcesses = Process.GetProcessesByName(ThisProcess.ProcessName);
if (AllProcesses.Length > 1)
{
// Nothing to do, process already running
}
else
{
Application.Run (new MainForm());
}
}
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

heu je commence ma migration vers C# mais ca existe pas les mutex ? :

void main (void)
{
HANDLE hMutex;
hMutex = ::CreateMutex (NULL, TRUE, "MyMutexName");
if ((hMutex NULL) || (::GetLastError()ERROR_ALREADY_EXISTS))
{
//"Impossible de créer le mutex"
return;
}

// Blahblah

::CloseHandle (hMutex);
}
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
80
a ta place je mettrais une seconde verif sur le chemin de l'exe, pour etre sur qu'il s'agit bien de ton exe, et pas d'un autre du même nom :
if (Proc_EnCours.ProcessName Processus.ProcessName && Proc_EnCours.MainModule.FileName Processus.MainModule.FileName)