Ma forme est-elle active ? Test incohérent quand je bascule avec la barre de tâc
Mutos
Messages postés103Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention14 mai 2010
-
6 nov. 2005 à 15:35
Mutos
Messages postés103Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention14 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 ?
Mutos
Messages postés103Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention14 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 ?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
Mutos
Messages postés103Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention14 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...
Mutos
Messages postés103Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention14 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...
Mutos
Messages postés103Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention14 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...