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

Messages postés
30
Date d'inscription
mardi 27 avril 2010
Dernière intervention
24 mars 2011
- - Dernière réponse : cs_luminor
Messages postés
30
Date d'inscription
mardi 27 avril 2010
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 ?
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
835
Date d'inscription
samedi 15 novembre 2008
Dernière intervention
14 janvier 2017
3
Merci
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!

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de cs_Robert33
Messages postés
30
Date d'inscription
mardi 27 avril 2010
Dernière intervention
24 mars 2011
0
Merci
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
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Dernière intervention
1 août 2013
0
Merci
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
Messages postés
30
Date d'inscription
mardi 27 avril 2010
Dernière intervention
24 mars 2011
0
Merci
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
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Dernière intervention
1 août 2013
0
Merci
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
Messages postés
30
Date d'inscription
mardi 27 avril 2010
Dernière intervention
24 mars 2011
0
Merci
"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
Messages postés
30
Date d'inscription
mardi 27 avril 2010
Dernière intervention
24 mars 2011
0
Merci
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
Messages postés
30
Date d'inscription
mardi 27 avril 2010
Dernière intervention
24 mars 2011
0
Merci
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.