Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment donner le focus à la MainForm d'un process

4 réponses
Avatar
ShadowFil
Bonjour,

Pour éviter de lancer 2 fois la même application, je boucle sur la liste des
processus déjà lancés et ayant le même nom.
S'il est déjà lancé, j'aimerais redonner le focus à la MainForm du processus
et l'afficher à l'avant-plan.

Mais comment ?

Merci pour votre aide.

4 réponses

Avatar
Julien Bakmezdjian [MS]
Bonjour,

Pour détecter la présence d'une instance de la même appli, peut-être
pourriez-vous utiliser plutôt la méthode de "Bull", dans le forum
microsoft.public.fr.dotnet.vb, dans le thread "Re: Comment récupérer une
valeur passée avec la Shell nom_appli.exe "valeur" ?". Cette méthode me
paraît plus propre (mais bon, des goûts et des couleurs...).

Sinon, pour passer une fenêtre en avant plan, vous pouvez peut-être utiliser
les APIs suivantes de Windows (pas possible je pense directement en .NET).
Utiliser P/Invoke pour appeler ces fonctions depuis du code managé (interop
facile à réaliser pour ces fonctions, ou facilement trouvable sur le Web) :

FindWindow (la fenêtre en question doit avoir un nom connu et unique) :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/findwindow.asp?frame=true

BringWindowToTop :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/bringwindowtotop.asp?frame=true

Cordialement,

Julien Bakmezdjian


"ShadowFil" a écrit dans le message de
news:
Bonjour,

Pour éviter de lancer 2 fois la même application, je boucle sur la liste
des
processus déjà lancés et ayant le même nom.
S'il est déjà lancé, j'aimerais redonner le focus à la MainForm du
processus
et l'afficher à l'avant-plan.

Mais comment ?

Merci pour votre aide.


Avatar
ShadowFil
Je ne vois pas en quoi c'est plus propre d'utiliser un Mutex. Cela utilise
des resources pour rien.

Voici la fonction que j'utilise. Dites-moi ce que vous en pensez ?

private static bool IsProcessRunning()
{
bool isProcessRunning = false;
Process currentProcess = Process.GetCurrentProcess();
Process[] processes =
Process.GetProcessesByName(currentProcess.ProcessName);

// Loop through the running processes with the same name of the current
process
foreach (Process process in processes)
{
// If there is a another copy already running, exit
if (process.Id != currentProcess.Id)
{
// TODO: Give the focus to the MainForm
isProcessRunning = true;
}
}

return isProcessRunning;
}
Avatar
ShadowFil
La propriété MainWindowHandle de la classe Process renvoie le handle de la
fenêtre principale du processus,
sous la forme d'un IntPtr.

Mais je ne sais pas quoi en faire ?
Avatar
Julien Bakmezdjian [MS]
Bonsoir,

Pour la détection d'une instance déjà existante, peu importe. Votre méthode
est je pense largement bonne.
Si vous possédez déjà le handle de la fenêtre à faire passer au premier
plan, la fonction BringWindowToTop que j'évoquai précédemment devrait
parfaitement faire l'affaire.

Cordialement,

Julien Bakmezdjian


"ShadowFil" a écrit dans le message de
news:
La propriété MainWindowHandle de la classe Process renvoie le handle de la
fenêtre principale du processus,
sous la forme d'un IntPtr.

Mais je ne sais pas quoi en faire ?