EMPECHER UNE APPLIC. DE SE LANCER 2 FOIS

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 23 févr. 2004 à 20:04
cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012 - 30 août 2010 à 09:01
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

cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012
30 août 2010 à 09:01
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
{
///////
}
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
12 août 2006 à 16:44
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 :-)
cs_vladam Messages postés 216 Date d'inscription dimanche 13 janvier 2002 Statut Modérateur Dernière intervention 7 novembre 2009
12 août 2006 à 16:25
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,
bucherb Messages postés 412 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 13 août 2007
5 oct. 2005 à 15:49
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());
bucherb Messages postés 412 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 13 août 2007
5 oct. 2005 à 15:39
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.
fred65200 Messages postés 100 Date d'inscription lundi 21 février 2005 Statut Membre Dernière intervention 18 février 2009
7 juil. 2005 à 13:07
il manque un P

Process[] RunningProcesses = process.GetProcessesByName("MonAppli");
fred65200 Messages postés 100 Date d'inscription lundi 21 février 2005 Statut Membre Dernière intervention 18 février 2009
7 juil. 2005 à 13:04
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);


@+
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
20 juin 2005 à 21:02
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.
cs_trystan007 Messages postés 32 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 22 août 2005
20 juin 2005 à 19:51
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?
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
16 déc. 2004 à 12:15
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)
{
}
}
}
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
16 déc. 2004 à 11:14
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
cs_JOSEJOSE Messages postés 1 Date d'inscription vendredi 3 décembre 2004 Statut Membre Dernière intervention 16 décembre 2004
16 déc. 2004 à 10:43
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;
}
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
23 mai 2004 à 17:04
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());
}
}
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
9 mars 2004 à 17:50
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);
}
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
23 févr. 2004 à 20:04
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)
Rejoignez-nous