2015-09-19 3 views
2

Je viens de commencer à utiliser l'entrée brute pour mon application. En arrivant directement à la question, dans les anciens messages WM_KEYDOWN, le lParam pourrait être vérifié pour obtenir des informations supplémentaires sur la touche. Comme ces-Recherche de données de répétition de clé dans le message WM_INPUT

Bits Meaning 
    0-15 The repeat count for the current message. 
      The value is the number of times the keystroke is autorepeated as a   
      result of the user holding down the key. If the keystroke is 
      held long enough, multiple messages are sent. However, the repeat 
      count is not cumulative. 
    16-23 The scan code. The value depends on the OEM. 
    24  Indicates whether the key is an extended key, such as the right-hand 
      ALT and CTRL keys that appear on an enhanced 101- or 102-key 
      keyboard. The value is 1 if it is an extended key; otherwise, it is 
      0. 
    25-28 Reserved; do not use. 
    29  The context code. The value is always 0 for a WM_KEYDOWN message. 
    30  The previous key state. The value is 1 if the key is down before the 
      message is sent, or it is zero if the key is up. 
    31  The transition state. The value is always 0 for a WM_KEYDOWN 
      message. 

Je veux savoir si un message WM_INPUT est une clé répétée, afin que je puisse ignorer ce message. (Désactiver keyrepeat.)

Le problème que j'ai est que cette les informations ne peuvent pas être trouvées pour le message WM_INPUT. le lParam du message WM_INPUT contient le handle d'une structure RAWINPUT. En faisant quelques recherches, je trouve que l'intérieur RAWINPUT::header contient un membre appelé wparam dans MSDN et décrit comme

wParam Type: WPARAM La valeur passée dans le paramètre wParam du message WM_INPUT. Est-ce que je trouverai l'information requise ici ou est-ce quelque part ailleurs?

+0

Essayez de consigner les messages 'WM_INPUT' dans la fenêtre de console/débogage. IIRC le système vous envoie un 'WM_INPUT' pour chacune des répétitions. – theB

+0

@theB oui, que je suis au courant. Je veux savoir si un message est répété pour que je puisse l'ignorer. Je vais mettre à jour la question avec cette info –

Répondre

4

L'API d'entrée RAW ne fournit pas de nombre de répétitions. C'est premières données provenant directement du clavier. Le nombre de répétitions est calculé à un niveau supérieur lorsque les messages WM_KEY... sont générés. En utilisant WM_INPUT, vous devrez suivre manuellement les états bas/haut de chaque touche pour déterminer vous-même le nombre de répétitions. Quand une clé tombe en panne, commencez à compter chaque message WM_INPUT pour cette clé. Lorsque la clé monte, arrêtez de le compter.

+0

oui, cela répond à ma question, mais je suis encore curieux de savoir ce que contient RAWINPUT :: header :: wParam ... –

+1

Il contient exactement ce que la documentation ['RAWINPUTHEADER'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645571.aspx) dit qu'il contient:" * La valeur transmise dans le paramètre wParam du message WM_INPUT * ". Et si vous lisez la documentation ['WM_INPUT'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645590.aspx), il est dit que le paramètre' wParam' est "*** Le code d'entrée Ce paramètre peut être l'une des valeurs suivantes: RIM_INPUT (0) RIM_INPUTSINK (1) **. * "Alors voilà, la valeur' header.wParam' spécifie si l'application était au premier plan ou non pendant le contribution. –

2

J'avais besoin de la même information que vous recherchez, et j'ai trouvé une solution de rechange raisonnable. Je ne me souciais pas du nombre de répétitions de touches, je voulais juste savoir si un message WM_INPUT représente une auto-répétition même si la pression initiale sur une touche s'est produite alors que mon application n'était pas nette et que la touche continuait à être maintenue lors de la mise au point commuté à mon application.

Jeter tout, mais le premier message WM_INPUT ne suffit pas de discerner cela, comme les clés tenues avant l'accent gagnant ressemblera nouveaux événements clés après avoir obtenu mise au point. Vous avez besoin de l'information dans WM_KEYDOWN/WM_SYSKEYDOWN lparam bit 30, et il n'est apparemment pas disponible à partir WM_INPUT. Nous travaillons autour de cela en demandant de continuer à recevoir des messages d'entrée hérités lors de l'enregistrement pour l'entrée brute en omettant l'indicateur RIDEV_NOLEGACY. Nous recevons des messages bruts et hérités, qui arrivent entrelacés. Pour tout message WM_INPUT pertinent contenant des informations de clé, il sera suivi par des messages hérités relatifs à cette clé avant l'arrivée de messages WM_INPUT supplémentaires. Notre bibliothèque d'entrée Windows rassemble des informations clés à partir des messages hérités & avant d'évaluer l'événement clé et cela fonctionne très bien pour nous.