Evènement Molette de la souris même sans focus
Publié : ven. 30/oct./2009 19:25
Coucou,
Je travaille toujours sur mon "Barre & Menu", un genre de dock.
Et j'avais besoin pour ce dock de choper l'évènement #WM_MouseWheel
Hors quand je place ma souris au dessus de la fenêtre du dock, le dock n'a pas forcément le focus. et si la fenêtre n'a as le focus, je ne reçois pas l'évènement #WM_MouseWheel
Hors cliquez dessus la fenêtre pour lui donner le focus et ensuite faire un coup de molette, c'est vraiment pas pratique.
Alors voilà la solution
La fenêtre à le focus, elle a normalement le #WM_MouseWheel
si la fenêtre n'a pas le focus, mais que la souris est au dessus de la fenêtre, je détecte l'utilisation de la molette (avec un Hook) et je renvois à ma fenêtre l'information #WM_MouseWheel
Je travaille toujours sur mon "Barre & Menu", un genre de dock.
Et j'avais besoin pour ce dock de choper l'évènement #WM_MouseWheel
Hors quand je place ma souris au dessus de la fenêtre du dock, le dock n'a pas forcément le focus. et si la fenêtre n'a as le focus, je ne reçois pas l'évènement #WM_MouseWheel
Hors cliquez dessus la fenêtre pour lui donner le focus et ensuite faire un coup de molette, c'est vraiment pas pratique.
Alors voilà la solution
La fenêtre à le focus, elle a normalement le #WM_MouseWheel
si la fenêtre n'a pas le focus, mais que la souris est au dessus de la fenêtre, je détecte l'utilisation de la molette (avec un Hook) et je renvois à ma fenêtre l'information #WM_MouseWheel
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4.40
;
; Explication du programme :
; Molette de la souris
; Windows API
#WHEEL_DELTA = 120
Global MouseWheelHook, MouseWheelWindow
Procedure LowLevelMouseProc(nCode.l, wParam.l, lParam.l)
If wParam = #WM_MOUSEWHEEL
If GetForegroundWindow_() <> MouseWheelWindow And WindowFromPoint_(DesktopMouseX() | DesktopMouseY() << 32) = MouseWheelWindow
; Si la fenêtre n'est pas active mais que la souris est au dessus
PostMessage_(MouseWheelWindow, #WM_MOUSEWHEEL, PeekL(lParam + 8), 0)
EndIf
EndIf
ProcedureReturn CallNextHookEx_(MouseWheelHook, nCode, wParam, lParam)
EndProcedure
Procedure AddMouseWheelHook(WindowID)
If MouseWheelHook = 0
MouseWheelHook = SetWindowsHookEx_(#WH_MOUSE_LL, @LowLevelMouseProc(), GetModuleHandle_(0), 0)
EndIf
MouseWheelWindow = WindowID
ProcedureReturn MouseWheelHook
EndProcedure
Procedure RemoveMouseWheelHook()
If MouseWheelHook
UnhookWindowsHookEx_(MouseWheelHook)
MouseWheelHook = 0
EndIf
EndProcedure
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
StickyWindow(0, 1)
AddMouseWheelHook(WindowID(0))
TextGadget(0, 5, 5, 290, 32, "")
Repeat
Event = WaitWindowEvent(50)
If Temps And ElapsedMilliseconds() - Temps > 1000
SetGadgetText(0, "")
Temps = 0
EndIf
Select Event
Case #WM_MOUSEWHEEL
Molette = -(EventwParam() >> 16) / #WHEEL_DELTA
SetGadgetText(0, "Molette = " + Str(Molette))
Temps = ElapsedMilliseconds()
EndSelect
Until Event = #PB_Event_CloseWindow
RemoveMouseWheelHook()