2010-10-23 43 views
1

En tant qu'amateur à tout ce qui est inférieur à VB/VBS (C++ WINAPI est un cauchemar pour quelqu'un de mon expérience) Je n'ai aucune idée de comment construire le long lParam pour un simple message KEYDOWN en C++ et ont probablement passé plus de temps à chercher une explication décente que vaut la peine, quelqu'un serait capable de décrire exactement comment s'y prendre?C++ WINAPI: Comment utiliser SendMessage/PostMessage WM_KEYDOWN lparam

Il semble que presque chaque réponse à cette question dans d'autres forums ait été «pourquoi» ou «utiliser SendInput à la place», sans réellement répondre à la question; Je suppose que c'est trop élémentaire pour que les gens puissent l'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 indicateur d'état clé, et indicateur d'état de transition, comme indiqué ...

0-15 Nombre de répétitions pour le message actuel. La valeur correspond au nombre de fois que la touche est répétée automatiquement en tant que si l'utilisateur maintient la touche enfoncée. Si la séquence de touches est suffisamment longue, plusieurs messages sont envoyés. Cependant, le nombre de répétitions n'est pas cumulatif. 16-23 Le code de balayage. La valeur dépend de l'OEM.

24 Indique si la clé est une clé étendue , comme les touches droite ALT et CTRL qui apparaissent sur un amélioré 101- ou un clavier 102 touches. La valeur est 1 si c'est une clé étendue; sinon, il est 0. 25-28 Réservé; faire ne pas utiliser

29 Le code de contexte. La valeur est 1 si la touche ALT est enfoncée tandis que la touche est enfoncée; il est 0 si le message WM_SYSKEYDOWN est publié dans la fenêtre active car aucune fenêtre n'a le focus du clavier.

30 L'état de la clé précédente. La valeur est 1 si la touche est enfoncée avant que le message soit envoyé, ou 0 si la clé est pleine.

31 L'état de transition. La valeur est toujours 0 pour un message WM_SYSKEYDOWN.

+0

Utilisez plutôt SendInput. Vraiment. Posez une question à ce sujet si vous ne le croyez pas. –

+0

Essentiellement intéressé par SendMessage pour gérer les dialogues dans l'automatisation des interfaces GUI pour des tâches répétitives (par exemple ajouter/mettre à jour des enregistrements dans une base de données contrôlée par un CMS qui ne permet pas un accès direct à la base de données SQL); Idéalement, cela pourrait se faire sans risque de perte de concentration, de sorte que l'ordinateur entier ne serait pas occupé. N'ayant pas un fort contexte de codage, il semble que ce soit la façon la plus simple/la plus sûre de gérer les éléments de type input = "file" plutôt que d'adresser un formulaire directement –

Répondre

1

De l'explication des messages lParam parameter of WM_KEYDOWN et Keystroke Message Flags chapitre, j'écrirait 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 peut comprendre un code aussi simple. :-)

OK, pour votre commodité, je google pour shr enseignement équivalent 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 mimer l'LOWORD et HIWORD en VB, voir How to Mimic HIWORD, LOWORD, HIBYTE, LOBYTE C Macros in VB.

+0

Thanks, a du sens –