ypelissier
Messages postés23Date d'inscriptionvendredi 16 mars 2012StatutMembreDernière intervention16 mai 2013
-
11 janv. 2013 à 15:23
ypelissier
Messages postés23Date d'inscriptionvendredi 16 mars 2012StatutMembreDernière intervention16 mai 2013
-
21 janv. 2013 à 16:17
Bonjour,
Je cherche à vérifier que le processus que je lance n'est pas déjà en cours d'exécution.
Vous me direz, facile, utilise ce code :
private bool IsRunning()
{
Process curProc = Process.GetCurrentProcess();
foreach (Process proc in Process.GetProcesses())
if (proc.Id !curProc.Id && curProc.ProcessName proc.ProcessName)
return true;
return false;
}
Et même plus simple :
private bool IsRunning()
{
foreach (Process proc in Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName))
if (proc.Id != curProc.Id)
return true;
return false;
}
OK, ça fonctionne bien... avec Windows bureau (XP/Vista/7).
Mais sous Windows CE, Windows mobile ou WM, version 5.0, dans le Compact Framework, ben ces 2 méthodes n'existent pas. Pourtant, lorsque je fais un équivalent du "ctrl+alt+supp" dessus, j'ai bien une liste des processus (allégé des processus système certainement), c'est donc qu'il doit y avoir un moyen.
Quelqu'un aurait-il une piste, une idée, une lumière à m'apporter pour relancer mes recherches ?
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201624 11 janv. 2013 à 23:13
Salut,
Voici une méthode :
en C, on utilise un Mutex, je te donne le code et la logique,
à toi de le porter en C# via p-invoke.
- 1 : a chaque init de l'appli on crée un Mutex nommé
- 2 : si le mutex existe, on réactive l'appli d'origine qui devait etre cachée ou réduite
- 2.1 : on sort sans créer d'instance
- 3 : si le mutex n'existe pas, on crée l'instance normalement
- 4 : dans tous les cas on supprime le handle à la fermeture de l'appli
// Membre de la classe principale
HANDLE m_MutexHandle = NULL;
// Init application
BOOL InitInstance()
{
// Crée un handle Mutex unique
m_MutexHandle = ::CreateMutex(NULL, FALSE, "UniqueMutexObject");
DWORD dwErr = ::GetLastError();
if ( dwErr == ERROR_ALREADY_EXISTS )
{
// Recherche et active l'instance déjà lancée
HWND hWnd = ::FindWindow(NULL, "MonApp.exe");
if( hWnd )
{
::ShowWindow(hWnd, SW_RESTORE);
::SetForegroundWindow(hWnd);
}
// Termine CETTE instance
return FALSE;
}
// suite de l'init
return TRUE;
}
// Ferme appli
void ExitInstance()
{
// Libère le handle, une autre instance pourra etre créée
if( m_MutexHandle != NULL )
::CloseHandle(m_MutexHandle);
}
ypelissier
Messages postés23Date d'inscriptionvendredi 16 mars 2012StatutMembreDernière intervention16 mai 2013 21 janv. 2013 à 16:13
Désolé pour le retard, mais j'ai eu d'autres chats à fouetter.
J'ai essayé les P-Invoke (heureusement que tu m'as dit ce que c'était car je ne connaissait pas le terme). J'ai réussi à faire ce que je voulait, mais j'ai eu d'autres choses à faire et en cherchant, je suis tombé sur ce site :
http://rapi.codeplex.com/releases/view/91052
Là j'avais plus qu'à réutiliser en comprenant ce qui était dans la DLL et surtout en maitrisant les fonctions de la DLL.
Merci pour tes conseils, à défaut de l'utiliser, j'ai au moins appris ce qu'était le P-Invoke.