WParam lParam (relance...)

Résolu
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 11 sept. 2005 à 04:36
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 13 sept. 2005 à 11:43
bonjour,
voilà, je relance pour ma question "incomplète"
la question est l'interprétation des paramètres wParam et lParam en retour de procédure (SubClassing)

BruNews m'a déjà répondu pour le X Y, mais je n'ai pas avancé concernant les autres points évoqués ici :
http://www.vbfrance.com/forum.v2.aspx?ID=555742

merci d'avance
PCPT

16 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 sept. 2005 à 10:04
wParam et lParam ne contiennent pas d'indication de la touche ALT en cas de WM_MOUSEWHEEL.

ciao...
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 sept. 2005 à 10:40
GetAsyncKeyState détermine l'état de traitement depuis un dernier appel, etc... Il faut pour cela analyser les bits en retour, comme d'hab MSDN donne tous les détails.
Pour .net, FINIS les OCX, tout passe en format dll. De vb6 à vb.net c'est tout de même un changement important, le modèle d'interaction change comme pas mal d'autres choses. Il serait de tout manière impensable de garder des composants sur la vieille virtual machine dans une distrib .net, ça ne passerait plus sur les prochains systèmes, il faut absolument convertir.

ciao...
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 sept. 2005 à 15:26
MOUSEWHEEL >= WM_MOUSEWHEEL
HOVER et LEAVE, c'est quoi en event Windows ?

ciao...
BruNews, MVP VC++
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
11 sept. 2005 à 15:36
c'est en diminutif....
selon le choix du dev, soit on appelle TrackMouseEvent2 au WM_MOUSEMOVE, déclanchant WM_MOUSEHOVER et WM_MOUSELEAVE, soit par un timer. (çà c'est ok)

mais le truc c'est que j'aurais voulu en même temps renvoyer comme param le Button Shift X Y
(X Y ok grâce à toi, encore un peu à revoir).
mais je n'arrive pas à obtenir les Button Shift (expliqué ancien topic)

et pour le WM_MOUSEWHEEL, c'est bien aussi wParam et lParam qui contiennent les infos clavier souris....

(rrrRRrRrRR, çà m'énerve....)
PCPT
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 sept. 2005 à 16:17
WM_MOUSEWHEEL:
coordonnees (pixel screen comme d'hab) X et Y dans lParam, X est dans 16 bits bas et Y 16 bits haut.
zDelta est dans 16bits haut de wParam, il vaudra normalement 120 si va vers le haut ou sinon -120, if wParam < 0 then c'est vers bas sinon haut.
if wParam And 4 Then Shift est appuyé.

Tu traiteras autres messages sur ce principe.

ciao...
BruNews, MVP VC++
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
11 sept. 2005 à 19:50
ok merci, je regarde çà ce soir et donnerai suite.
PCPT
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
12 sept. 2005 à 02:21
re,

bon, je me retrouve avec les mêmes résultats qu'avec les calculs précédents
(wParam And 65535 ... wParam / 65536)

voici des extraits de code :


' ##################
' Déclaration
' ##################

Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
Private Declare Function loword Lib "TLBINF32" (ByVal DWord As Long) As Integer
Private Declare Function hiword Lib "TLBINF32" (ByVal DWord As Long) As Integer

Private Type BSXYType
DirWheel As Integer
Button As Integer
Shift As Integer
X As Single
Y As Single
End Type
Private Const WheelUp As Integer = 1
Private Const WheelDown As Integer = -1

Public Event WheelScroll(Direction As Integer, Button As Integer, _
Shift As Integer, X As Single, Y As Single)

' ##################
' CallBack procédure
' ##################

Case WM_MOUSEWHEEL: Debug.Print "Mouse Wheel " & wParam; lParam
Dim TmpAll As BSXYType
TmpAll = TmpScroll(wParam, lParam)
RaiseEvent WheelScroll(TmpAll.DirWheel, TmpAll.Button, _
TmpAll.Shift, TmpAll.X, TmpAll.Y)

' ##################
' Convertion
' ##################

Private Function TmpScroll(ByVal wParam As Long, ByVal lParam As Long) _
As BSXYType

'WM_MOUSEWHEEL:
'coordonnees (pixel screen comme d'hab) X et Y dans lParam, X est dans 16 bits bas et Y 16 bits haut.
'zDelta est dans 16bits haut de wParam, il vaudra normalement 120 si va vers le haut ou sinon -120,
'If wParam < 0 Then c 'est vers bas sinon haut.
'if wParam And 4 Then Shift est appuyé.

Dim PtMouse As MOD_API.POINTAPI

'direction If wParam < 0 Then TmpScroll.DirWheel WheelDown Else TmpScroll.DirWheel WheelUp

'button
TmpScroll.Button = loword(wParam)

'shift
TmpScroll.Shift = hiword(wParam)

'X & Y + conversion
PtMouse.X = loword(lParam)
PtMouse.Y = hiword(lParam)
Call ScreenToClient(mhWnd, PtMouse)

TmpScroll.X = PtMouse.X
TmpScroll.Y = PtMouse.Y

End Function



<SMALL> Coloration syntaxique automatique [AFCK] </SMALL>


et j'en suis au même point. je n'arrive pas à récupérer le Alt.
zDelta vaut effectivement 120 (ou -120) et les X Y correspondent (juste à moi à ne pas renvoyer l'évènement si extérieur à RECT)

donc j'ai du mal comprendre qqc. puisque 120 en permanance.
donc c'est mon zKey à retravailler..... ()
ctrl + click molette + rotation molette vers le bas = 24.

... je viens de revérifier à l'instant, j'ai exactement la mêem chose qu'avant.... (mais par API)
pourquoi ALT me retourne zéro.
pourquoi WheelClick me retourne 16.
"if wParam And 4 Then Shift est appuyé" ... il faut que je gère séparément chaque combinaison?

j'avais commencé, mais toujours ce problème avec ALT :


Private Function ConvertWparamToButtonShift(Param As Long) As ButtonShiftType
Param = Param And 65535

Select Case Param Case 0: ConvertWparamToButtonShift.Button 0: ConvertWparamToButtonShift.Shift 0 Case 1: ConvertWparamToButtonShift.Button 1: ConvertWparamToButtonShift.Shift 0 Case 2: ConvertWparamToButtonShift.Button 2: ConvertWparamToButtonShift.Shift 0 Case 3: ConvertWparamToButtonShift.Button 3: ConvertWparamToButtonShift.Shift 0 Case 16: ConvertWparamToButtonShift.Button 4: ConvertWparamToButtonShift.Shift 0 Case 17: ConvertWparamToButtonShift.Button 5: ConvertWparamToButtonShift.Shift 0 Case 18: ConvertWparamToButtonShift.Button 6: ConvertWparamToButtonShift.Shift 0 Case 19: ConvertWparamToButtonShift.Button 7: ConvertWparamToButtonShift.Shift 0
Case 4: ConvertWparamToButtonShift.Button 0: ConvertWparamToButtonShift.Shift 1 Case 8: ConvertWparamToButtonShift.Button 0: ConvertWparamToButtonShift.Shift 2
'Alt non-reçu
End Select
End Function


<SMALL> Coloration syntaxique automatique [AFCK]</SMALL>


désolé de ce roman mais je commence à perdre patience....

PCPT
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
12 sept. 2005 à 13:25
salut BruNews,
j'ai appelé la même fonction (TmpScroll) au WM_MOUSEMOVE (avec ou sans les ByVal) et je n'ai pas non plus le Alt.
et aussi, mes X Y ne sont pas les mêmes au WM_MOUSEMOVE qu'au WM_MOUSEWHEEL
(faux au MOVE).

tu es le seul à me répondre, désolé de te "harceler", mais je bloque vraiment....
faut-il faire un GetKeyState ? çà donne du hook dans du SubClass?! çà me semble bizarre....

et pour les X Y
le Form_Move me retourne par exemple : 2310 1155
et le WM_MOUSEMOVE (même pt) : -8745 -4185

help?
PCPT
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 sept. 2005 à 13:50
WM_MOUSEMOVE: si les valeurs sont < 0 c'est que souris est plus haute et/ou à gauche de la fenêtre, si pas le cas y a un scmoll dans tes calculs. Comme d'hab faire gaffe aux conversions, surtout aux twips de vb.

GetKeyState devrait aller, rien de bizzare et n'a rien à voir avec du hook.

Attention que wParam et lParam n'ont pas toujours le même type d'info, dépend du message WM_xxx, voir MSDN pour détails.

Faut te poser la question de savoir si ça vaut encore le coup de passer autant de temps à transposer tout cela pour vb qui est en fin de vie, le passage à .net est absolument obligatoire pour un VBiste et il ne faut pas perdre de temps en informatique, les choses vont trop vite pour qu'on puisse se le permettre.

ciao...
BruNews, MVP VC++
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
12 sept. 2005 à 14:32
re,
* souris..... < 0*0
non, souris ok. par contre, apparemment, quand je place ma fenêtre en 0*0 (+ caption), çà correspond à peu près.
çà doit donc être ScreenToClient pour l'un, et ClientToScreen pour l'autre.

*GetKeyState, je doute que les retours de proc ne contiennent pas ces infos. mais bon, à défaut, j'essaierai.

*même type, oui, j'avais déjà vu, mais merci.

*.net, ah non, me sape pas le moral. je suis bien conscient que VB6 meurt.... mais je commence à peine à m'y retrouver...
j'ai fait pas mal de recherches sur des sites de sondages, VB6 à beau mourir, il s'accapare 78% des développeurs VBsuite.
et je serais bien curieux de savoir combien le 2005 coûtera quand il ne sera plus Beta......

ici j'ai VB6 qui devait valoir 4000F, et 2003/architecte que je n'ai même pas installé.
le FrameWork a toujours déconné (pas de bol pour moi).

...c'est pas une envie soudaine de parler, mais autant je compte explorer un peu java en 2006, autant pour changer de langage chez Kro$oft, je suis en quête d'informations et d'incitations...
si tu as des points forts à me montrer (et envie), n'hésite pas.

pour rester sur ce Topic, je donnerai suite pour KeyState...
Merci bcp

PCPT
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 sept. 2005 à 15:06
1 seul point suffit et doit effacer tous les autres: l'énorme croissance continuelle des offres d'emploi sur .net, VB et C# confondus, aucun autre discours ne peut tenir face à la réalité.
Si prob de prix et se comprend aisément, passe au C/C++ et tu trouveras des compilos gratuits, certes pas le confort et la puissance de VS mais qui permettent de bosser sans problème, je t'assure que tu seras le bienvenu sur cppfrance.

Revenons à ta touche ALT:
faut être précis, ce qui arrive dans wParam lParam sur les events WM_xxx ne sont pas des 'retours' mais les infos accompagnant l'évènement, il est donc normal qu'on n'est pas tout l'état du système matériel sur tous les events, il y en a pour chaque type, les WM_KEYxxx contiennent les infos clavier, etc... WM_MOUSEWHEEL ne fournit en revanche rien sur touche ALT.

ciao...
BruNews, MVP VC++
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
12 sept. 2005 à 15:30
umm. en effet, argument de taille.
je vais méditer...
un conseil entre 2005 beta et ma version 2003 existante?

ALT : le Form_Move contient bien ce ALT.
qu'il "n'accompagne" pas chaque param, ok. mais je suppose qu'il est au moins dans le WM_MOUSEMOVE (sans certitude bien sûr...)

ps : dll-activex et ocx compilés fait sous vb6 compatibles .net sans modifs? vice-versa?

PCPT
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 sept. 2005 à 15:46
2005 sans l'ombre d'une hésitation, toutes les applis .net migrent ou migreront sur le framework 2 alors autant y aller de suite.


Ne te base jamais sur ce que donne en param la virtual machine vb quand tu veux sous classe car à ce moment c'est direct du système que tu prends les params, pas du tout la même chose.
WM_MOUSEMOVE n'embarque pas non plus d'indication sur ALT, seulement SHIFT et CTRL. Faut pas hésiter à regarder MSDN sur chaque event, les params y sont clairement indiqués.

ciao...
BruNews, MVP VC++
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
12 sept. 2005 à 16:00
compris!
je donnerai suite. (qui sait, peut-être aussi sur cppF)

merci encore.
PCPT
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
13 sept. 2005 à 03:12
bon.
voici le code complet (séparément) pour voir coment recevoir ce fichu Alt


Const VK_SHIFT = &H10
Const VK_TAB = &H9
Const VK_RCONTROL = &HA3
Const VK_LSHIFT = &HA0
Const VK_RSHIFT = &HA1
Const VK_CONTROL = &H11
Const VK_LCONTROL = &HA2
Const VK_MENU = &H12
Const VK_LMENU = &HA4
Const VK_RMENU = &HA5

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
'
'
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If (GetKeyState(VK_MENU) And &HF0000000) Then Me.Print "ALT"
'If (GetAsyncKeyState(VK_MENU) And &HF0000000) Then Me.Print "ALT"
End Sub
'
'
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.Cls
End Sub



<SMALL> Coloration syntaxique automatique [AFCK]</SMALL>


2 petites questions avant de valider (réponse collégiale celà dit),
1. pourquoi plus GetKeyState que GetAsyncKeyState ?
2. relance question ci-dessus // .net "ps : dll-activex et ocx compilés fait sous vb6 compatibles .net sans modifs? vice-versa?"

encore quelques adapatations et je vais enfin pouvoir "gagner du temps"

Merci sincèrement !

@ bientôt
PCPT
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
13 sept. 2005 à 11:43
ok.
on peut clôturer ce topic^^
Merci @+

PS : ceux qui veulent les constantes VirtualKey : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/UserInput/VirtualKeyCodes.asp

PCPT
0
Rejoignez-nous