Origine de ma perte de focus sur mon winform [Résolu]

cs_luminor 30 Messages postés mardi 27 avril 2010Date d'inscription 24 mars 2011 Dernière intervention - 11 mars 2011 à 00:02 - Dernière réponse : cs_luminor 30 Messages postés mardi 27 avril 2010Date d'inscription 24 mars 2011 Dernière intervention
- 14 mars 2011 à 22:05
Bonsoir,

3 jours de recherches et toujours pas de solution. Je désespère un peu...

Je développe une application de type "Lanceur d'applications pour clé USB". Le projet se concentre sur une winform skinable. Pour cette raison le formulaire est nu (pas de barre titre, ni boutons maximise/minimise...). Il n'apparait pas non plus en taskBar (ShowStakBar=False).

Un notifyIcon est présent dans systay et je rencontre un problème de gestion de focus.

Le notifyIcon est lié à un contextmenustrip et lorsque je click sur l'icone mon formulaire se désactive ????? Le notifyIcon est un control enfant de mon formulaire, je ne comprends donc pas que le form se désactive !

La solution je la connais mais ne trouve pas le moyen de la codée. Dans la gestion de mon évènement Form.Desactivate il me faut savoir si c'est un click sur le notifyIcon qui en est à l'origine, mais comment récupéré cette information ?
Afficher la suite 

Votre réponse

8 réponses

cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 12 mars 2011 à 10:29
+3
Utile
Bonjour

J'ai eu à faire ce genre de truc, et voila comment j' l'ai résolu:
en fait je joue sur le WindowsState et le ShowInTaskbar plutot que le Show/Hide
Et je n'ai pas de probleme de focus.

        private void notifyIcon1_Click(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.WindowState = FormWindowState.Normal;
            }
            else
            {
                this.WindowState = FormWindowState.Minimized;
            }
        }
        private void Form1_SizeChanged(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Minimized)
            {
                ShowInTaskbar = false;
            }
            else
                ShowInTaskbar = true;

        }



Bob.
C# is amazing, enjoy it!
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Robert33
cs_luminor 30 Messages postés mardi 27 avril 2010Date d'inscription 24 mars 2011 Dernière intervention - 11 mars 2011 à 00:10
0
Utile
Petite précision, je gère les mouseEvent sur le notifyIcon, j'ai donc essayé d'ajouté un Flag pour informer mon Form.Desactivate. Le soucis c'est que l'événement Form.Desactivate intervient avant que mon Flag soit en place dans mon notifyIcon.mouseDown.
Commenter la réponse de cs_luminor
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 11 mars 2011 à 10:18
0
Utile
Salut,

je comprends pas bien le souci. En effet c'est le comportement normal que tu décris : quand tu cliques en-dehors d'un objet, celui-ci perd le focus (c'est la définition même du focus).

y'a-t-il un but précis à ce que tu veuilles que ta Form garde le focus ? Ce que tu pourrais faire à la rigueur c'est, à la fin de ton Event Click (ou MouseClick), rendre la main à ta Form avec un simple appel à this.Focus().

Désolé si j'ai répondu à côté
Commenter la réponse de cs_jopop
cs_luminor 30 Messages postés mardi 27 avril 2010Date d'inscription 24 mars 2011 Dernière intervention - 11 mars 2011 à 11:20
0
Utile
Merci pour ta réponse.

"En effet c'est le comportement normal que tu décris" pas tout à fait... le notifyIcone fait bien parti du formulaire (c'est un enfant) donc pour moi un click sur ce dernier ne devrait pas activé le "Desactivate" du dit formulaire^^

Ce que j'essaie de faire c'est de donner à mon application un comportement proche des logiciels classiques, à savoir :

Mon logiciel est un lanceur d'applications, s'il est visible mais que l'utilisateur fait le choix de travailler sur un autre logiciel ou dans Windows, le formulaire se désactive (Event Desactivate) ca ca fonctionne.

Mon logiciel est affiché, l'utilisateur click droit sur l'icone de notifycation pour atteindre le menu contextuel, si le formulaire est visible il ne doit pas disparaitre, pourtant il y a perte de focus donc il devient invisible et ca c'est pas bon.

Autre cas de figure, l'utilisateur click gauche sur l'icone de notification deux possibilités, le formulaire est visible, son click le rend invisible ou le formulaire est invisible et dans ce cas il devient visible mais là encore le focus interfère.

Devant ce constat il me faut savoir au moment d'exécuter le désactivate, s'il a été enclenché à cause d'un click sur notifyIcon et auquel cas je n'exécute pas le code de perte de focus du formulaire.

Ai-je été plus précis ? merci
Commenter la réponse de cs_luminor
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 11 mars 2011 à 14:52
0
Utile
c'est pas mal précis oui ^^
mais en fait tu Hide() ta Form sur l'event Deactivate ?

PS : un NotifyIcon n'est pas un Control à proprement parler, comme tu as pu -malheureusement- le constater, il ne réagit pas de la même manière qu'un Label ou un Panel ;)
Commenter la réponse de cs_jopop
cs_luminor 30 Messages postés mardi 27 avril 2010Date d'inscription 24 mars 2011 Dernière intervention - 12 mars 2011 à 00:03
0
Utile
"mais en fait tu Hide() ta Form sur l'event Deactivate ?" effectivement de passe this=;visible à false. Comme tu le dis très bien le notifyIcon ne semble pas réellement être un enfant de ma form, ce qui pose problème car en cliquant je perds le focus, ce qui n'aurait pas été le cas de tout autre control enfant. Il ne faut donc savoir quand l'évennement Desactivate se produit si le notifyIcon en est la cause en récupérant cette information (par je ne sais quelle magie ^^) je pourrais annuler le Desactivate du form, mais comment coder cela hum....
Commenter la réponse de cs_luminor
cs_luminor 30 Messages postés mardi 27 avril 2010Date d'inscription 24 mars 2011 Dernière intervention - 13 mars 2011 à 03:54
0
Utile
Merci Robert33 pour ce code, j'ai contourné le PB pour le moment (faut avancé malgré tout^^) mais je testerais ta solution rapidement encore merci.
Commenter la réponse de cs_luminor
cs_luminor 30 Messages postés mardi 27 avril 2010Date d'inscription 24 mars 2011 Dernière intervention - 14 mars 2011 à 22:05
0
Utile
Après quelques tests avec la solution de Robert33 (que je remercie^^) mon problème est résolu... Il est en effet plus facile et souple de jouer avec maximise/minimise plutôt que hide/show.
Commenter la réponse de cs_luminor

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.