Origine de ma perte de focus sur mon winform

Résolu
cs_luminor Messages postés 30 Date d'inscription mardi 27 avril 2010 Statut Membre Dernière intervention 24 mars 2011 - 11 mars 2011 à 00:02
cs_luminor Messages postés 30 Date d'inscription mardi 27 avril 2010 Statut Membre Dernière intervention 24 mars 2011 - 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 ?

8 réponses

cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
12 mars 2011 à 10:29
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!
3
cs_luminor Messages postés 30 Date d'inscription mardi 27 avril 2010 Statut Membre Dernière intervention 24 mars 2011
11 mars 2011 à 00:10
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.
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
11 mars 2011 à 10:18
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é
0
cs_luminor Messages postés 30 Date d'inscription mardi 27 avril 2010 Statut Membre Dernière intervention 24 mars 2011
11 mars 2011 à 11:20
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
11 mars 2011 à 14:52
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 ;)
0
cs_luminor Messages postés 30 Date d'inscription mardi 27 avril 2010 Statut Membre Dernière intervention 24 mars 2011
12 mars 2011 à 00:03
"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....
0
cs_luminor Messages postés 30 Date d'inscription mardi 27 avril 2010 Statut Membre Dernière intervention 24 mars 2011
13 mars 2011 à 03:54
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.
0
cs_luminor Messages postés 30 Date d'inscription mardi 27 avril 2010 Statut Membre Dernière intervention 24 mars 2011
14 mars 2011 à 22:05
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.
0
Rejoignez-nous