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

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

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

Message 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()
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

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

Message par Le Soldat Inconnu »

correction du code
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

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

Message par venom »

Merci ça peut toujours servir :P





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message par Kwai chang caine »

Cool, merci pour le partage.
Effectivement ....ça sera surement utile :wink:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

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

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

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

Message par Le Soldat Inconnu »

merci
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre