Hook dans UserControl [Résolu]

Signaler
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
cs_candyraton
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Statut
Membre
Dernière intervention
2 février 2012
-
Violent Ken

Bonjour, j'aimerais pouvoir hooker le MouseWheel dans un UserControl. Mais j'ai un problème.

En effet, mon hook fonctionne de cette manière :

1) appel du hook au loading du contrôle ==>

hHook = SetWindowsHookEx(WH_GETMESSAGE, AddressOf MouseProc, App.hInstance, App.ThreadID)

2) la procédure MouseProc est localisée en PUBLIC (pour pouvoir utiliser AdressOf) et DANS mon UserControl (pour pouvoir faire un RaiseEvent)
Elle a cette allure :

Public Function MouseProc(ByVal idHook As Long, ByVal wParam As Long, lParam As MSG) As Long

Problème : argument de type perso (MSG), donc impossible de passer la fontion en Public. Mais impossible de la mettre en Private, à cause du AdressOf.

Que devrais-je faire ? Y a t-il un autre moyen pour hooker la molette sur mon UserControl ?

Merci, @+

8 réponses

Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010

Violent Ken

Pour ceux qui passeraient ici, voilà la réponse à la question
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=64867&lngWId=1

Merci à B0mbJack.

@+
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
33
Regarde comment est foutu MSG, mais c'est surrement une structure.

Et ce que tu passe à la fonction c'est un pointeur sur la structure donc un long.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010

Violent Ken

Salut, voilà le détail de MSG :

Public Type POINTAPI
        x As Long
        y As Long
End Type


Public Type MSG
    hwnd As Long
    message As Long
    wParam As Long
    lParam As Long
    time As Long
    pt As POINTAPI
End Type

Je comprend pas vraiment comment résoudre le problème. Je dois mettre un argument lParam en long ? Mais comment récupère-je lParam.message et lParam.wParam (dont j'ai besoin) ?

@+
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
33
Moi j'ai réussi à le faire passer (sans le hook), en mettant la fonction publique, type MSG en parametre.

Par contre, j'ai mis les def des structures en public dans un module.
Car dans la feuille tu serais obligé de les mettre en private, et private ça passe pas en paramètre.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010

Violent Ken

J'ai la même chose, mais avec en plus l'erreur "Seuls les types publics définis par l'utilisateur et qui sont définis dans les modules d'objets publics peuvent être utilisés comme types renvoyés ou paramètres pour des procédures publiques de module de classe, ou comme champ de type public définit par l'utilisateur".

Alors que j'ai bien défini, en public, MSG dans un module...

Si je déplace la fonction MouseProc vers un module, çà marche.... mais plus possible de faire un RaiseEvent dans mon UserControl.
Messages postés
141
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
25 octobre 2006

Lu,

si tu veux intercepter le message de la moulette de ta souris, voici un exemple

j'utilise cette fonction pour agrandir ma région sur une form à l'aide de la moulette

Const WM_MOUSEWHEEL = &H20A
Public WndProc As Long

WndProc = SetWindowLong(Form1.Hwnd, GWL_WNDPROC, AddressOf NewWndProc)

Public Function NewWndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 If Msg = WM_MOUSEWHEEL Then If wParam > 0 Then RayonCercle RayonCercle + 10 Else RayonCercle RayonCercle - 10
end if
NewWndProc = CallWindowProc(WndProc, hwnd, Msg, wParam, lParam)
End Function

               
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010

Violent Ken

Salut, merci bcp, mais même problème : la fonction NewWndProc doit être déclarée dans un module (impossible dans le usercontrol). Donc je ne peux pas faire de RaiseEvent :(

@+
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Statut
Membre
Dernière intervention
2 février 2012
3
Bonjour, le lien a changé, voilà la nouvelle adresse: http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=64867&lngWId=1
Merci violent pour tes contributions.