cs_coq
Messages postés6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014
-
23 févr. 2004 à 20:04
cs_lolo818
Messages postés22Date d'inscriptionjeudi 7 janvier 2010StatutMembreDernière intervention27 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.
cs_lolo818
Messages postés22Date d'inscriptionjeudi 7 janvier 2010StatutMembreDernière intervention27 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és6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 12 août 2006 à 16:44
cs_vladam
Messages postés216Date d'inscriptiondimanche 13 janvier 2002StatutModérateurDerniè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és412Date d'inscriptionlundi 26 mai 2003StatutMembreDernière intervention13 août 2007 5 oct. 2005 à 15:49
bucherb
Messages postés412Date d'inscriptionlundi 26 mai 2003StatutMembreDernière intervention13 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és100Date d'inscriptionlundi 21 février 2005StatutMembreDernière intervention18 février 2009 7 juil. 2005 à 13:07
fred65200
Messages postés100Date d'inscriptionlundi 21 février 2005StatutMembreDernière intervention18 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és6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 20 juin 2005 à 21:02
cs_trystan007
Messages postés32Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention22 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és714Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention19 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és6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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)
cs_JOSEJOSE
Messages postés1Date d'inscriptionvendredi 3 décembre 2004StatutMembreDernière intervention16 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és714Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention19 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és714Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention19 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és6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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)
30 août 2010 à 09:01
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
{
///////
}
12 août 2006 à 16:44
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 :-)
12 août 2006 à 16:25
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,
5 oct. 2005 à 15:49
bool isNew = false;
Mutex mut = new Mutex(false, mutName,out isNew);
if (!isNew) return;
Application.Run(new Form1());
5 oct. 2005 à 15:39
7 juil. 2005 à 13:07
Process[] RunningProcesses = process.GetProcessesByName("MonAppli");
7 juil. 2005 à 13:04
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);
@+
20 juin 2005 à 21:02
20 juin 2005 à 19:51
16 déc. 2004 à 12:15
{
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)
{
}
}
}
16 déc. 2004 à 11:14
un exemple pour les mutex : http://www.thecodeproject.com/csharp/cssingprocess.asp
16 déc. 2004 à 10:43
/// <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;
}
23 mai 2004 à 17:04
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());
}
}
9 mars 2004 à 17:50
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);
}
23 févr. 2004 à 20:04
if (Proc_EnCours.ProcessName Processus.ProcessName && Proc_EnCours.MainModule.FileName Processus.MainModule.FileName)