Case TypeOf CtrlHooked Is ComboBox Or TypeName(CtrlHooked) = "ComboBox"
On Error Resume Next
If Mdata > 0 _
Then .TopIndex = Application.Max(0, .TopIndex - 1) _
Else .TopIndex = Application.Min(.TopIndex + 1, .ListCount)
If Err <> 0 Then CtrlHooked.DropDown
Err.Clear: On Error GoTo ErrorCritique
tim = Timer
Case TypeOf CtrlHooked Is ComboBox Or TypeName(CtrlHooked) = "ComboBox"
On Error Resume Next
If Mdata > 0 Then .TopIndex = .TopIndex - 1 Else .TopIndex = .TopIndex + 1
If Err <> 0 Then CtrlHooked.DropDown
Err.Clear: On Error GoTo ErrorCritique
En plus, il faudrait qu'on soit plus réactif..je peux pas attendre que vous soyez dispo a chaque fois que j'ai quelque chose a tester
c'est trop long et je ne peux même pas examiner pourquoi
franchement je me demande qu'est que vous pouvez leur trouver de bien à ces versions 64 bits
vous pouvez plus rien faire avec a part ce que microsoft a concocté pour vous
a quel prix surtout (et là je parle de liberté de developpement vba)
vous me disiez cematin que la frame etait en retard la listbox je ne sais quoi et la combo pareil
Ok, je remet tout à l'initial, voilà ce que ça donne : erreur de topindex et dès qu'on clique sur ok, Excel se planteca devrait être .listcount-1 car les listes sont en base 0
je vais te dire sincèrement enlève tout et laisse le on error resume next
et en plus tu renvoie sur erro critique qui renvoie sur nettoyage et donc ferme et recomence
conclusion eleve les app.max/min et laisse les gestions d'erreur tu aura le même résultat...
ça, c'est sûr, l'erreur du topindex en dehors des limites de la liste est de ce fait ignorée ( pas très propre celà ),: j'avais du les établir avant de faire le dropdown, sinon crash .conclusion eleve les app.max/min et laisse les gestions d'erreur tu aura le même résultat
Là, je comprend pas, je n'ai rien dit à propos des timers jusqu'à maintenant. Te connaissant, je suppose que tu ne les a pas mis pour le plaisir ?.en plus je comprends pas les timer je les ai enlevé maintenant tu m'a dit que c'etait pas bon
Pas touché à la listbox: à première vue, le système se fout de son topindex ( l'équipe qui l'a développée ne devait pas être la même que celle du Combobox .... )et je suppose que tu a fait pareil pour la listbox ???
Moi?et c'est toi qui me la demandé le scroll en plus
ça, c'est sûr, l'erreur du topindex en dehors des limites de la liste est de ce fait ignorée ( pas très propre celà ),: j'avais du les établir avant de faire le dropdown, sinon crash .
#If Win64 Then
Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As LongPtr) As LongPtr
#Else
Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
#End If
On Error GoTo ErrorCritique ' Improved error handling
Dim Criter As Boolean, i&, Mdata
GetCursorPos pos
Criter = plHooking <> 0 'si le thread plhooking <>0 c'est bon
Criter = Criter And IsArray(EpC) 'si EpC est un array c'est bon
Criter = Criter And Not CtrlHooked Is Nothing 'si CtrlHooked n'est pas nothing c'est bon
Criter = Criter And wParam <> 0 'si wparam <>0alors la struture de la mouse a été captée
'et en fin si les coordonnées sont dans le rectangle corespondant au corordonnées du rectangle du control c'est bon
Criter = Criter And pos.X > EpC(0) And pos.X < EpC(2) And pos.Y > EpC(1) And pos.Y < EpC(3) ' Get control's coordinates in pixels
If Not Criter Then UnHookMouse: Exit Function 'possibilité non critique criter est false alors on sort(le move sur control refera un nouvel appel)
If (nCode = HC_ACTION) Then 'si ncode renvoie bien action alors on est bon la structure est captée
If Timer - tim > 2 Then UnHookMouse: Exit Function
If wParam = WM_MOUSEWHEEL Then 'si wparam renvoie bien 522 soit &H20A alors la structure est bonne
LowLevelMouseProc = True 'alors on est true(32 bits relance le hook en looping (pas le 64)
Mdata = GetHookStruct(lParam).mouseData 'on récupère le mouse data
With CtrlHooked
.SetFocus
'selon le control appellant (ou designé)
'on testera le typeof et le typename selon les configs typeof renvoie une mauvaise reponse
Select Case True
Case TypeOf CtrlHooked Is Frame Or TypeName(CtrlHooked) = "Frame"
If Mdata > 0 Then .ScrollTop = .ScrollTop - 45 Else .ScrollTop = .ScrollTop + 45
tim = Timer
Case TypeOf CtrlHooked Is ListBox Or TypeName(CtrlHooked) = "ListBox"
If Mdata > 0 Then .TopIndex = .TopIndex - 1 Else .TopIndex = .TopIndex + 1
tim = Timer
Case TypeOf CtrlHooked Is ComboBox Or TypeName(CtrlHooked) = "ComboBox"
On Error Resume Next
If Mdata > 0 _
Then .TopIndex = Application.Max(0, .TopIndex - 1) _
Else .TopIndex = Application.Min(.TopIndex + 1, .ListCount)
If Err <> 0 Then CtrlHooked.DropDown
Err.Clear: On Error GoTo ErrorCritique
tim = Timer
Case TypeOf CtrlHooked Is TextBox Or TypeName(CtrlHooked) = "TextBox"
If Mdata > 0 Then
.CurLine = Application.Max(0, .CurLine - 2)
Else
.CurLine = Application.Min(.LineCount - 1, .CurLine + 2)
End If
tim = Timer
Case TypeOf CtrlHooked Is ScrollBar Or TypeName(CtrlHooked) = "ScrollBar"
If Mdata > 0 Then .Value = .Value - 1 Else .Value = .Value + 1
tim = Timer
End Select
End With
End If
Exit Function 'ici on sort tout c'est bien passé
End If
'----------------------------------'
'Gestion d'erreur critique dans un switch entre deux exit function
Nettoyage: 'ici on a été renvoyé par errorCritique
If Err.Number <> 0 Then Err.Clear: UnHookMouse
On Error GoTo 0
LowLevelMouseProc = CallNextHookEx(plHooking, nCode, wParam, lParam) 'évidemment là on est obligé de rappeller car tout est mort ,dead ,ralbate ,crevé etc...
Debug.Print "on sort en catastrophe de " & CtrlHooked.Name: Exit Function ' on sort on va pas boucler sur une erreur ca suffit une fois espece de saucisse!!!!
ErrorCritique:
Debug.Print "erreur critique" & CtrlHooked.Name
MsgBox "Une erreur est survenue pendant hook " & vbCrLf & Err.Description, vbCritical, CtrlHooked.Name
Resume Nettoyage ' on renvoie au nettoyage pour tout nettoyer et relancer avec callnexthook neccessaire cette fois ci car externe à la partie ou tout se passe bien
End Function
#If Win64 Then
Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As LongPtr) As LongPtr
#Else
Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
#End If
On Error GoTo ErrorCritique ' Improved error handling
Dim Criter As Boolean, i&, Mdata
GetCursorPos pos
Criter = plHooking <> 0 'si le thread plhooking <>0 c'est bon
Criter = Criter And IsArray(EpC) 'si EpC est un array c'est bon
Criter = Criter And Not CtrlHooked Is Nothing 'si CtrlHooked n'est pas nothing c'est bon
Criter = Criter And wParam <> 0 'si wparam <>0alors la struture de la mouse a été captée
'et en fin si les coordonnées sont dans le rectangle corespondant au corordonnées du rectangle du control c'est bon
Criter = Criter And pos.X > EpC(0) And pos.X < EpC(2) And pos.Y > EpC(1) And pos.Y < EpC(3) ' Get control's coordinates in pixels
If Not Criter Then UnHookMouse: Exit Function 'possibilité non critique criter est false alors on sort(le move sur control refera un nouvel appel)
If (nCode = HC_ACTION) Then 'si ncode renvoie bien action alors on est bon la structure est captée
'If Timer - tim > 2 Then UnHookMouse: Exit Function
If wParam = WM_MOUSEWHEEL Then 'si wparam renvoie bien 522 soit &H20A alors la structure est bonne
LowLevelMouseProc = True 'alors on est true(32 bits relance le hook en looping (pas le 64)
Mdata = GetHookStruct(lParam).mouseData 'on récupère le mouse data
With CtrlHooked
.SetFocus
'selon le control appellant (ou designé)
'on testera le typeof et le typename selon les configs typeof renvoie une mauvaise reponse
Select Case True
Case TypeOf CtrlHooked Is Frame Or TypeName(CtrlHooked) = "Frame"
If Mdata > 0 Then .ScrollTop = .ScrollTop - 45 Else .ScrollTop = .ScrollTop + 45
'tim = Timer
Case TypeOf CtrlHooked Is ListBox Or TypeName(CtrlHooked) = "ListBox"
If Mdata > 0 Then .TopIndex = .TopIndex - 1 Else .TopIndex = .TopIndex + 1
'tim = Timer
Case TypeOf CtrlHooked Is ComboBox Or TypeName(CtrlHooked) = "ComboBox"
On Error Resume Next
If Mdata > 0 _
Then .TopIndex = Application.Max(0, .TopIndex - 1) _
Else .TopIndex = Application.Min(.TopIndex + 1, .ListCount)
If Err <> 0 Then CtrlHooked.DropDown
Err.Clear: On Error GoTo ErrorCritique
'tim = Timer
Case TypeOf CtrlHooked Is TextBox Or TypeName(CtrlHooked) = "TextBox"
If Mdata > 0 Then
.CurLine = Application.Max(0, .CurLine - 2)
Else
.CurLine = Application.Min(.LineCount - 1, .CurLine + 2)
End If
'tim = Timer
Case TypeOf CtrlHooked Is ScrollBar Or TypeName(CtrlHooked) = "ScrollBar"
If Mdata > 0 Then .Value = .Value - 1 Else .Value = .Value + 1
'tim = Timer
End Select
End With
End If
Exit Function 'ici on sort tout c'est bien passé
End If
'----------------------------------'
'Gestion d'erreur critique dans un switch entre deux exit function
Nettoyage: 'ici on a été renvoyé par errorCritique
If Err.Number <> 0 Then Err.Clear: UnHookMouse
On Error GoTo 0
LowLevelMouseProc = CallNextHookEx(plHooking, nCode, wParam, lParam) 'évidemment là on est obligé de rappeller car tout est mort ,dead ,ralbate ,crevé etc...
Debug.Print "on sort en catastrophe de " & CtrlHooked.Name: Exit Function ' on sort on va pas boucler sur une erreur ca suffit une fois espece de saucisse!!!!
ErrorCritique:
Debug.Print "erreur critique" & CtrlHooked.Name
MsgBox "Une erreur est survenue pendant hook " & vbCrLf & Err.Description, vbCritical, CtrlHooked.Name
Resume Nettoyage ' on renvoie au nettoyage pour tout nettoyer et relancer avec callnexthook neccessaire cette fois ci car externe à la partie ou tout se passe bien
End Function
Case TypeOf CtrlHooked Is ComboBox Or TypeName(CtrlHooked) = "ComboBox"
On Error Resume Next
If Mdata > 0 _
Then .TopIndex = Application.Max(0, .TopIndex - 1) _
Else .TopIndex = Application.Min(.TopIndex + 1, .ListCount - (.ListRows - 1))
If Err <> 0 Then CtrlHooked.DropDown
Err.Clear: On Error GoTo ErrorCritique