C ++ WINAPI: Comment utiliser SendMessage / PostMessage WM_KEYDOWN lparam
-
25-09-2019 - |
Question
En tant qu'amateur à quoi que ce soit inférieur à VB / VBS (C ++ WINAPI est un cauchemar pour quelqu'un de mon expérience) Je ne sais pas comment s'y prendre pour construire long lParam pour un simple message KEYDOWN en C ++ et ont probablement passé plus de temps à la recherche d'une explication décente que vaut la peine, serait quelqu'un en mesure de décrire exactement comment aller à ce sujet?
Il semble que presque toutes les réponses à cette question dans d'autres forums a été « pourquoi » ou « utiliser SendInput à la place », sans répondre effectivement à la question; Je devine que c'est beaucoup trop élémentaire pour les gens à expliquer. Quoi qu'il en soit, voici la description de msdn, apprécierions beaucoup une explication décente ou un lien vers un, et un exemple travaillé si possible:
Le nombre de répétitions, le code de balayage, drapeau-clé étendue, le code de contexte, précédent drapeau clé état, et drapeau d'état de transition, comme le montre ...
0-15 Le nombre de répétitions du courant message. La valeur est le nombre de fois la combinaison de touches est autorepeated comme à la suite de l'utilisateur en maintenant la clé. Si la combinaison de touches est de longue date assez, plusieurs messages sont envoyés. Cependant, le nombre de répétitions est pas cumulatif. 16-23 Le code d'analyse. le la valeur dépend de l'OEM.
24 Indique si la clé est un clé étendue, comme la droite touches ALT et CTRL qui apparaissent sur un amélioré 101- ou un clavier 102 touches. le La valeur est 1 si elle est une clé étendue; , Il en est autrement 0. 25-28 Réservé faire pas utiliser
29 Le code de contexte. La valeur est 1 si la touche ALT est en baisse alors que la clé est pressé; il est 0 si le WM_SYSKEYDOWN message est affiché à la fenêtre active car aucune fenêtre n'a le clavier mise au point.
30 L'état clé précédente. La valeur est 1 si la touche est enfoncée avant la message est envoyé, ou il est 0 si la clé est en place.
31 L'état de transition. La valeur est toujours 0 pour un message WM_SYSKEYDOWN.
La solution
De l'explication de lParam paramètre du message de WM_KEYDOWN et Drapeaux message Keystroke chapitre, je voudrais écrire le code suivant pour faire face à la valeur de lParam :
iRepeatCount := LOWORD(lParam);
iScanCode := HIWORD(lParam) and $FF;
iExtendedKey := (HIWORD(lParam) and KF_EXTENDED) shr 8;
iContextCode := (HIWORD(lParam) and KF_ALTDOWN) shr 13;
iPreviousState := (HIWORD(lParam) and KF_REPEAT) shr 14;
iKeyDown := (HIWORD(lParam) and KF_UP) shr 15;
Bien qu'il soit mise en œuvre Delphi, je suis sûr que vous pouvez comprendre un tel code simple. : -)
OK, pour votre commodité, je Google pour enseignement équivalent de shr
en VB, et je reçois ceci:
Private Function SHL(ByVal inVal As Long, ByVal inShift As Byte) As Long
SHL = inVal * (2 ^ inShift) ' Bit shift left
End Function
Private Function SHR(ByVal inVal As Long, ByVal inShift As Byte) As Long
SHR = inVal \ (2 ^ inShift) ' Bit shift right
End Function
Pour imiter le LOWORD
et HIWORD
en VB, consultez Comment Mimic HIWORD, LOWORD, HIBYTE, LOBYTE C Macros dans VB .
Autres conseils
http://msdn.microsoft.com/en -us / bibliothèque / ms646280 (VS.85) .aspx
Le lparam est une valeur de 32 bits; chaque bit contrôle un aspect différent du message WM_KEYDOWN. Pour remplir correctement le lparam, vous pouvez essayer d'utiliser espion ++ pour voir ce réel des messages WM_KEYDOWN ressemblent.