Comment donner le focus à la MainForm d'un process
4 réponses
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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.
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
"ShadowFil" <ShadowFil@discussions.microsoft.com> a écrit dans le message de
news: D922200C-DAC1-4F68-8FD6-7CAFC9EB1858@microsoft.com...
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.
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
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.
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 ?
// 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; }
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 ?
// 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;
}
}
// 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; }
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 ?
La propriété MainWindowHandle de la classe Process renvoie le handle de la
fenêtre principale du processus,
sous la forme d'un IntPtr.
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 ?
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 ?
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" <ShadowFil@discussions.microsoft.com> a écrit dans le message de
news: 33A91498-C37A-4CEC-86E4-704E348CF0EC@microsoft.com...
La propriété MainWindowHandle de la classe Process renvoie le handle de la
fenêtre principale du processus,
sous la forme d'un IntPtr.
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.