XL 2016 Quelle API pour savoir si une ListBox (UserForm ou ActiveX) a sa ScrollBar Verticale présente ?

Dudu2

XLDnaute Barbatruc
Bonjour les XLDNautes,

Si on peut, sans API, savoir si une ComboBox a son ascenseur affiché grâce à la différence (ComboBox.ListCount - ComboBox.ListRows) ce n'est pas possible avec les ListBoxes.
Certes on connaît son ListBox.TopIndex mais il n'existe pas de ListBox.BottomIndex.
Un approximation est possible avec la ListBox.Font.Size mais ça reste imprécis.

Reste l'API qui pourrait indiquer la présence d'une Vertical ScrollBar mais mes essais sont restés infructueux.
Merci pour toute suggestion.
 
Solution
pour ce qui est de cette discussion j'ai revue la chose pour les ListBox dans userform et feuille

Dudu2

XLDnaute Barbatruc
Les commentaires:
VB:
'---------------------------------
'GetControlHandleByWindowFromPoint
'Ne fonctionne pas pour les Controls de UserForms
'---------------------------------
C'est une erreur, je les ai retirés depuis.

Moi je veux bien changer pour obtenir le Pane par la position du curseur plutôt que par celle du Control.
Mais que ce soit par l'un ou par l'autre, il faut aller chercher le Pane pour savoir si le curseur est dans la ComboBox de feuille ou sa DropDown zone.
 

patricktoulon

XLDnaute Barbatruc
il faut aller chercher le Pane pour savoir si le curseur est dans la ComboBox de feuille ou sa DropDown zone.
ben par rapport à ta démo non
qu'est ce tu en a a foutre l'event move de la combo se declenche aussi dans le child
windowfrompoint donne le handle
getwindowrect te donne le rectangle (pane ou pas pane)
qu'est qu'on peut bien se balancer du reste ???
il y a que en effet sur les feuilles fractionné(non figé) que çà déraille car l'event move n'est pas déclenché visiblement tout du moins dans nos 2 module hook
donc on peut oublier les fractionnée pour les controls
mais les figé pas de soucis car il ne peut pas y avoir deux mêmes controls à l’écran
après je vois pas a quoi sert la fonction profondeur mais bon si tu veux

avec windowfrompoint ok en 64 et getwindowrect tu a tout pour te simplifier la tache et réduire de plus de 70% le code de ton hook tout en étant plus sur!!! pourquoi hésiter
 

patricktoulon

XLDnaute Barbatruc
ben mon model sans windowfrompoint est déjà reduit de 50%
maintenant que l'on sait faire fonctionner windowfrompoint et getwindowrect sur 32 et 64
j'aurais cru que ça t'aurait intéressé

en tout cas pour moi cette fonction Gethandle est parfaite et n'a besoins de rien d'autre
VB:
Function GetControlHandleByWindowFromPoint(Ctl As Object) As LongPtr
    Dim Hold As POINTAPI, clss$, hwnd&, hwndP&
    'Position curseur
    GetCursorPos Hold
    #If Win64 Then
        hwnd = WindowFromPoint(PointToLongLong(Hold))
    #Else
        hwnd = WindowFromPoint(Hold.x, Hold.y)
    #End If
    'ListBox
    Select Case True
    Case TypeOf Ctl Is MSForms.ListBox
        GetControlHandleByWindowFromPoint = hwnd
        Exit Function

    Case TypeName(Ctl) = "ComboBox"
        clss = Space$(255)
        hwndP = GetParent(hwnd)
        GetClassName hwndP, clss, 255
        If InStr(1, clss, "F3 MdcPopup") = 0 Then hwnd = 0    ' si c'est un popu alors
    End Select

    GetControlHandleByWindowFromPoint = hwnd
End Function
quand on move avec la souris se sera 0 si on est pas dans le child de la comb et le handle dans les autres fenêtre non MDI(Listbox,Frame,MultPage)

Wat else ?
 

patricktoulon

XLDnaute Barbatruc
je viens de constater aussi que dans une feuille avec figé si pas releasepanes ton model ne fonctionne qu'une fois aussi , j'ai donc remis ma releasepane dans l'activate de la feuille
et a la place du msgbox modal qui risque de tout faussé j'ai mi le message en h9
et cela avec ma fonction simplifié du handle et la release pane(ou ta methode que tu voudras bien appliquer) la j'ai mis la releasepane (chez moi je ne l'active qu'une fois à l'activate)peut etre que vous en 64 vous serez obligé de le faire en sortie de hook à chaque fois

et pour info j'ai le même résultat dans tes 3 userforms
j'ai testé dans tout les sens pas une fois y a eu une erreur ou une méprise
demo.gif
 

Pièces jointes

  • GetControlHandleWithWindowFromPöint V pat .xlsm
    52.6 KB · Affichages: 1

Dudu2

XLDnaute Barbatruc
Ben tu vois, je préfère de très loin que tu me parles en VBA.
Pourquoi tu fabriques tout le temps du texte à rallonge avec gras, couleurs, tailles augmentées, dans des tonnes de posts qu'on a du mal à lire et à comprendre ? Du code et c'est vendu. What else !

Excellent code que tu as fait avec le test du ClassName !
 

Pièces jointes

  • GetControlHandleWithWindowFromPoint.xlsm
    59.6 KB · Affichages: 1
Dernière édition:

patricktoulon

XLDnaute Barbatruc
ben c'est celui que j'utilise déjà dans mon model hook N5 le 6 etant depourvu completement d'api a part getcursorpos et les api hook

allez je me lance dans un nouveau model de hook avec ces idées je met ça au propre et je te transmet tu va voir comme çà va être simple
des que j'avance je reviens
 

patricktoulon

XLDnaute Barbatruc
d'ailleurs j'avais laisser des bellugues
pour faire propre le exit function n'est plus necessaire puisque l'on est dans un select case
par contre par securité on met un case else histoire de bien brider le truc
c'est propre et net
VB:
Function GetControlHandleByWindowFromPoint(Ctl As Object) As LongPtr
    Dim Hold As POINTAPI, clss$, hwnd&, hwndP&
    'Position curseur
    GetCursorPos Hold
    #If Win64 Then
        hwnd = WindowFromPoint(PointToLongLong(Hold))
    #Else
        hwnd = WindowFromPoint(Hold.x, Hold.y)
    #End If
      Select Case True
    Case TypeOf Ctl Is MSForms.ListBox Or TypeOf Ctl Is Frame
        GetControlHandleByWindowFromPoint = hwnd
    Case TypeName(Ctl) = "ComboBox"
        clss = Space$(255)
        hwndP = GetParent(hwnd)
        GetClassName hwndP, clss, 255
        If InStr(1, clss, "F3 MdcPopup") = 0 Then hwnd = 0    ' si c'est un popu alors
    Case Else: hwnd = 0
    End Select
    GetControlHandleByWindowFromPoint = hwnd
End Function
seul les frames listbox combobox retourneront un handle si les conditions sont bonnes
le reste walouh !!
 

Dudu2

XLDnaute Barbatruc
Fort de ta trouvaille sur les ComboBox, j'ai publié une nouvelle version (V3) du Scroll.
Dans l'information de version, j'ai cité ton nom bien sûr 🤠.
 

patricktoulon

XLDnaute Barbatruc
je teste
et toi teste celui la sur les deux feuilles ,les api 64 je ne peux pas controler
nous reste quand même ce problème de panes que je zappe avec ma sub releasepane mais bon c'est quand même boff même si ça marche il y a un tout petit sursaut
il va falloir plancher la dessus

je reviens apres avoir testé le tiens sous toutes les coutures

Fichier supprimé
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bon je vois que tu a adopté mon test class ca c'est nikel
j'ai vu aussi que tu a adopté ma fonction panindex comme ça on est sur

mais comme tu l'a vu ou va le voir dans le mien en full api windowfrompoint et getwindowrect on a plus besoins de tout ça

la mécanique est exclusive (listbox frame et combobox )reien d'autre ne peut retouné un handle donc pas de hooking scroll
 

Statistiques des forums

Discussions
314 486
Messages
2 110 115
Membres
110 672
dernier inscrit
CHACHALUBAN