Page 1 sur 1

Evènement Molette de la souris même sans focus

Publié : ven. 30/oct./2009 19:25
par Le Soldat Inconnu
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

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()

Re: Evènement Molette de la souris même sans focus

Publié : ven. 30/oct./2009 22:00
par Le Soldat Inconnu
correction du code

Re: Evènement Molette de la souris même sans focus

Publié : ven. 30/oct./2009 23:34
par venom
Merci ça peut toujours servir :P





@++

Re: Evènement Molette de la souris même sans focus

Publié : lun. 02/nov./2009 17:13
par Kwai chang caine
Cool, merci pour le partage.
Effectivement ....ça sera surement utile :wink:

Re: Evènement Molette de la souris même sans focus

Publié : jeu. 12/nov./2009 21:20
par nico
Il faut tester la valeur nCode (Voir Remarque sur MSDN)

Code : Tout sélectionner

Procedure LowLevelMouseProc(nCode.l, wParam.l, lParam.l)
  If nCode=#HC_ACTION
    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
  EndIf
  ProcedureReturn CallNextHookEx_(MouseWheelHook, nCode, wParam, lParam)
EndProcedure

Re: Evènement Molette de la souris même sans focus

Publié : jeu. 12/nov./2009 22:54
par Le Soldat Inconnu
merci