Le point de départ de ce problème est la question "doit-on changer le OWNER d'un UserForm" ?
Parce que s'il est placé ou déplacé sur l'une des fenêtres d'un classeur qui n'est pas son OWNER, on le sait grâce à l'évènement UserForm_Layoit(), il sera masqué totalement ou partiellement par cette fenêtre dès lors qu'elle sera active. Et dans ce cas, il faut changer son OWNER par le Handle de la fenêtre en question.
D'où la question... Quel est le taux de recouvrement du UserForm RECT par un Window RECT.
La fonction PourcentageUserFormSurfaceCouverteParWindow dans ce fichier est à écrire !
C'était un truc à l'aveugle avec un And sur &HFF donc ça m'étonne pas que ça fonctionne pas en 32 bits.
VB:
Function LeUserFormEstIlEnTaksBar() As Variant 'Boolean
Dim iStyle As Variant
iStyle = GetWindowLongPtr(UserFormHandle, GWL_EXSTYLE)
LeUserFormEstIlEnTaksBar = Not CBool(iStyle And &HFF)
End Function
Allez, un dernier test... Quant à faire un truc bourrin !
Pouvez-vous me dire les 2 valeurs retournées en 32 bits selon que c'est en TaksBar ou pas ?
Chez moi 64 bits:
- En standard: 256 ou 257
- En Taskbar: 262400
re
avant d'essayer ton dernier fichier je peux te dire pourquoi ça ne fonctionne pas
si tu avais pris le temps de regarder la video j'explique justement ça
je le répète il faut faire les choses dans un certain ordre
avec ton fichier 1 je suis déjà à 256 et 262400
Si vous avez ces chiffres qui sont les mêmes que les miens, alors je ne comprends pas pourquoi le test du fichier donne des résultats différents puisque c'est juste un AND avec un 0xFF.
Sinon, sur la base de ce sujet de stackoverflow, une approche un peu moi aveugle... A tester encore !
La fonction c'était ça. Sachant que les 256/257 et 262400 sont les iStyle.
VB:
Function LeUserFormEstIlEnTaksBar() As Variant 'Boolean
Dim iStyle As Variant
iStyle = GetWindowLongPtr(UserFormHandle, GWL_EXSTYLE)
LeUserFormEstIlEnTaksBar = Not CBool(iStyle And &HFF)
End Function
Alors la différence par rapport à Not CBool(iStyle) c'est que ça ne se retrouve plus False pour des bits à 1 de poids forts au moins 2^8 dans iStyle, c'est ça ?
C'est un test bidon que j'ai fait à l'aveugle qui en plus ne fonctionne pas pour 256.
C'est pour ça que les résultats sont différents en fonction de la valeur que prend le iStyle en affichage standard 256 ou 257.
J'ai tout faux sur ce fichier. Mea culpa !
VB:
Sub a()
MsgBox "256->" & (Not CBool(256 And &HFF)) & vbCrLf & _
"257->" & (Not CBool(257 And &HFF)) & vbCrLf & _
"262400->" & (Not CBool(262400 And &HFF))
End Sub
Dans le pire des cas je testerai sur les valeurs du iStyle 256/257 ou 262400. Ou discriminer sur 262400.
Puisque je n'ai rien trouvé dans les API pour déterminer si une Window est dans la TaskBar.
Merci @Dranreb pour cette confirmation.
C'est moins bourrin que le 262400 mais ce n'est pas non plus la panacée car ce masque CBool(iStyle And WS_EX_APPWINDOW) n'est en rien un indicateur de présence en TaskBar. Je l'ai utilisé en parcourant toutes les Windows du Desktop et ça ne marche absolument pas dans cette perspective. Mais ça semble marcher pour une Window de UserForm alors je vais m'accrocher à cette petite branche.