Hook dans UserControl [Résolu]

Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
- - Dernière réponse : cs_candyraton
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Statut
Membre
Dernière intervention
2 février 2012
- 2 févr. 2012 à 21:54
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, @+
Afficher la suite 

8 réponses

Meilleure réponse
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
3
Merci
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.

@+

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 193 internautes nous ont dit merci ce mois-ci

Commenter la réponse de violent_ken
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
28
0
Merci
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 #
Commenter la réponse de cs_casy
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
0
Merci
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) ?

@+
Commenter la réponse de violent_ken
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
28
0
Merci
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 #
Commenter la réponse de cs_casy
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
0
Merci
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.
Commenter la réponse de violent_ken
Messages postés
141
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
25 octobre 2006
0
Merci
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

               
Commenter la réponse de B0mbJacK
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
0
Merci
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 :(

@+
Commenter la réponse de violent_ken
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Statut
Membre
Dernière intervention
2 février 2012
3
0
Merci
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.
Commenter la réponse de cs_candyraton