Ma forme est-elle active ? Test incohérent quand je bascule avec la barre de tâc

Mutos Messages postés 103 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 14 mai 2010 - 6 nov. 2005 à 15:35
Mutos Messages postés 103 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 14 mai 2010 - 7 nov. 2005 à 07:21
Bonjour,


J'ai un code VB.Net dans lequel je teste si ma Form est active ou non. J'utilise les critères suivante : Me.Visible à True et Me.WindowState différent de WindowStateMinimized. Je gére les événements suivants dans le code de la Form : MyBase.Activated, MyBase.Deactivate, MyBase.VisibleChangedOr.

Lorsque je clique sur la barre de tâches pour faire basculer l'application, la détection ne fonctionne pas. Il semblerait que l'appui sur un bouton dans la barre des tâches ne change rien à l'état de la fenêtre correspondante, malgré le fait qu'un événement soit appelé.

J'ai même essayé les vieilles API GetForegroundWindow et GetActiveWindow trouvés en recherchant ici, mais pour l'instant sans succès, les Handles ramenés ne me donnent rien d'exploitable.

Existe-t'il il une manière de dire sans ambiguïté si ma Form est au premier plan ?

Merci d'avance,


@+

Benoît 'Mutos' ROBIN
http://hoshikaze.net

12 réponses

Mutos Messages postés 103 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 14 mai 2010
6 nov. 2005 à 15:36
Bonjour,


Erreur de ma part, c'est FormWindowState.Minimized qu'il faut lire !


@+

Benoît 'Mutos' ROBIN
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 nov. 2005 à 15:58
salut
API GetForeGroundWindow.
si handle = ta form, bah voilà ;)
++
PCPT [AFCK]
0
Mutos Messages postés 103 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 14 mai 2010
6 nov. 2005 à 17:25
Slt pcpt,


Merci pour ta réponse, mais :) çà se trouve déjà ici 3 ou 4 fois et j'ai déjà essayé... Cf dans mon premier message : "J'ai même essayé les vieilles API GetForegroundWindow et GetActiveWindow trouvés en recherchant ici, mais pour l'instant sans succès, les Handles ramenés ne me donnent rien d'exploitable."

Justement, elles ne trouvent jamais ma Form et j'ignore ce quelles raménent en fait... Sinon tu comprend bien que je n'aurai pas posté la question ici ^-^
Il doit y avoir quelque chose de plus sioux... Je pense essayer de récupérer le nom de la Form active et de l'afficher quelque part. Est-ce que çà fait une différence si j'ai une Form en Always On Top dans l'application pour afficher ce que je retrouve, sachant que le Handle retourné par GetForegroundWindow ou GetActiveWindow ne correspond pas à cette Form non plus ? D'autre part, pour "ta form, bah voilà", tu fais bien Me.Handle dans la Form principale ou bien oMonAutreForm.Handle si c'est pas la même ?


@+

Benoît 'Mutos' ROBIN
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 nov. 2005 à 17:29
je suis sous VB6.
donc lRet = Get.....
si lRet = Me.Hwnd alors c'est celle là.
je regarde çà de plus près. désolé d'avoir survolé ton topic^^
0

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

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 nov. 2005 à 17:44
testé, çà semble correct.... (mais VB6)

un bouton, un timer


' exemple à partir du Guid-API
Option Explicit
'
Private Declare Function GetForegroundWindow Lib "user32" () As Long
'
Private Declare Function Ellipse Lib "gdi32" _
(ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, _
ByVal X2 As Long, ByVal Y2 As Long) As Long
'
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
'
'
Private Sub Form_Load()
' timer pour avoir largement le temps de perdre le focus
Timer1.Enabled = False
Timer1.Interval = 3000
End Sub
'
'
Private Sub Command1_Click()
Timer1.Enabled = True
End Sub
'
'
Private Sub Timer1_Timer()
Dim lRet As Long
lRet = GetForegroundWindow()
Me.Cls
If lRet = Me.hwnd Then
Me.Print "PREMIER PLAN": Debug.Print "PREMIER PLAN"
Else
Me.Print "PAS AU 1er PLAN": Debug.Print "PAS AU 1er PLAN"
End If

lRet = GetDC(lRet)
Ellipse lRet, 0, 0, 200, 200
Timer1.Enabled = False
End Sub



<SMALL> Coloration syntaxique automatique [AFCK]</SMALL>


ton but est lequel exactement, savoir quand elle perd le focus? savoir quand elle le retrouve alors qu'elle était minimisée?
0
Mutos Messages postés 103 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 14 mai 2010
6 nov. 2005 à 18:16
Bonjour pcpt,


Mon problème c'est qu'apparemment ma Form ne se rend pas compte qu'elle perd le focus lorsqu'elle est minimisée dans la barre de tâches. De ce fait, mes fonctions d'entrée marchent toujours alors que je ne suis plus dans mon application, ce qui ne me va pas (zoom à la souris, etc...) et de plus je souhaite désactiver le rendu 3D lorsque l'application n'a plus le focus...

Je cherche encore un peu de mon coté...


@+

Benoît 'Mutos' ROBIN
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 nov. 2005 à 18:30
arf, ok. et bien va voir ma source "Focus SubClassing", çà devrait répondre à ta question
(sauf que c'est aussi du VB6).
@+ ;)
0
Mutos Messages postés 103 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 14 mai 2010
6 nov. 2005 à 20:08
Slt pcpt,


Merci de ta réponse, je regarde ta source au plus tôt. Peut-être sont-ce les événements que j'utilise qui ne sont pas les bons, d'ailleurs...


@+

Benoît 'Mutos' ROBIN
0
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
6 nov. 2005 à 20:31
Bonjour

Nurgle
Il est plus aisé d'être sage pour les autres que pour soi-même ! (La Rochefoucauld)
0
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
6 nov. 2005 à 20:46
(Arrg , désolé j'ai eu un problème avec la FreeTextBox )

Je recommence :



Bonjour,



Tu es sûr que l'évenênement LostFocus n'est pas déclenché quand tu minimises ta Form ?

Cherche aussi du côté de l'événement Deactivate, qui est l'équivalent de Leave, mais pour une Form.



C'est plutôt bien expliqué ici : http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpref/html/frlrfsystemwindowsformscontrolclassleavetopic.asp





Nurgle
0
Mutos Messages postés 103 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 14 mai 2010
6 nov. 2005 à 22:35
Bonjour Nurgle,


J'ai entendu de drôles de choses sur LostFocus et GotFocus, style ils ne se comportaient pas comme ils étaient décrits dans la doc, mais je vais aussi investiguer de ce coté et si je trouve quelque chose je vous le signale...


@+

Benoît 'Mutos' ROBIN
0
Mutos Messages postés 103 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 14 mai 2010
7 nov. 2005 à 07:21
Bonjour à tous,


Encore merci pour toute votre aide, qui a bien déblayé le terrain ^-^ Je crois avoir une solution, il faut que je la teste encore un peu, et ensuite je la débarrasse des affichages de test et je vous la passe. J'ai carrément abandonné les événements et je teste la visibilité à chaque tour de ma boucle de rendu. J'aimerai bien gâcher moins de CPU, mais je ne vois pas comment faire...


@+

Benoît 'Mutos' ROBIN
0
Rejoignez-nous