2010-08-31 8 views
1

J'ai besoin d'aide avec WM_KEYDOWN, je veux supprimer la "pause" entre la première frappe et les pressions répétées.Besoin d'aide avec WM_KEYDOWN

Si vous maintenez en permanence un bouton enfoncé, je souhaite que le programme le réalise directement. Je cherche à faire un jeu avec directx. Se il vous plaît me dire si je devrais utiliser autre chose que WM_KEYDOWN.

+0

Le délai de répétition des touches et la fréquence de répétition des touches sont généralement définis dans le BIOS –

Répondre

2

Veuillez définir "continuellement". Si l'utilisateur appuie sur un bouton et le relâche immédiatement que vous obtiendrez immédiatement l'événement WM_KEYDOWN et WM_KEYUP. Sinon, si l'utilisateur ne relâche pas la touche pendant un certain temps, Windows la détectera à l'aide d'une minuterie interne et continuera à déclencher des événements WM_KEYDOWN jusqu'à ce qu'un bouton soit relâché.

Vous ne pouvez pas faire grand chose à ce sujet parce que vous devez attendre un certain temps pour savoir si un bouton est pressé et n'est pas relâché. Ce que vous pouvez faire, cependant, ne tient pas compte des événements continus WM_KEYDOWN de Windows et traite le bouton comme étant enfoncé et non relâché jusqu'à ce que vous obteniez un événement WM_KEYUP. Appelons cela un pari ou, mieux encore, une optimisation de branche.

2

Cela peut ne pas être exactement le comportement que vous recherchez, mais ne pouvez-vous pas simplement ignorer d'autres messages WM_KEYDOWN jusqu'à ce que vous receviez un WM_KEYUP?

1

Vous pouvez utiliser des variables booléennes et les définir sur true lorsqu'une touche est enfoncée. Si la valeur de la variable est true, vous arrêtez de faire l'action. Et lorsque la clé est en place, vous définissez la variable sur false.

// ... 
some switch 
// ... 
case WM_KEYDOWN: 
    if (!keydown) { 
     // do the magic 
     keydown=true; 
    } 
break; 
case WM_KEYUP: 
    keydown=false; 
break; 

Bien sûr, si vous voulez faire quelque chose en permanence, vous devez par exemple régler une minuterie dans l'instruction if (! Keydown) et arrêter le chronomètre lorsque l'utilisateur relâche la touche.

0

Un indicateur s'affiche avec WM_KEYDOWN indiquant si WM_KEYDOWN est le premier ou les uns répétés. Il suffit de rechercher MSDN pour WM_KEYDOWN vous devriez pouvoir le trouver.

De MSDN: lParam bit 30: spécifie l'état de clé précédent. La valeur est 1 si la touche est enfoncée avant l'envoi du message, ou zéro si la touche est en haut.