2010-06-14 5 views
1

Je veux déterminer si un CTRL clé est GAUCHE CTRL ou droite CTRL touche lorsqu'elle est pressée. Comment puis-je faire ceci?Puis-je déterminer si une touche Ctrl est enfoncée Ctrl gauche ou Ctrl droite?

+0

Qu'avez-vous eu jusqu'à présent? En outre, une raison spécifique pour laquelle vous voulez différencier les deux? – Gishu

+1

Pouvez-vous donner des détails supplémentaires? – jfs

+0

Puisque personne d'autre n'a demandé ... pourquoi voudriez-vous faire la différence entre les deux? – jrista

Répondre

1

Cependant, vous pouvez utiliser l'API Win32 GetAsyncKeyState pour tester si des clés spécifiques sont actuellement désactivées, ce qui peut différencier les touches ctrl gauche et droite. (Si vous écrivez un jeu, cela fonctionne mieux pour vous que pour les gestionnaires de Keydown, car GetAsyncKeyState teste si la clé est "maintenant" plutôt que si elle a été pressée "à un moment donné dans le passé", ce qui donne considérablement meilleure réactivité).

1

Apparemment pas à partir de .NET, mais c'est possible à partir des API Win32.

  • Les pistes de dénombrement System.Windows.Forms.Key gauche, à droite, et les boutons milieu de la souris, mais n'a qu'un seul drapeau pour les touches de contrôle, donc aucun moyen de déterminer gauche ou à droite pour les touches de commande. Le Console.ReadKey() method souffre du même problème.
  • Vous pourriez être en mesure de faire quelque chose au niveau Win32. Le WM_KEYDOWN message suivra les clés étendues (droite Alt, contrôle à droite), donc Windows suit ces données ... il n'est tout simplement pas transmis à .NET. Vous êtes seul à l'écoute de l'API Win32 à partir de .NET. Je ne peux pas accéder à cette information à partir de .net.
1

Puisque vous écrivez un jeu, il pourrait être utile aussi utiliser DirectInput ... Winforms est pas vraiment destiné à da gaimez OMI ...

Device di_device = new Device(SystemGUID.Keyboard); 
di_device.SetCooperativeMode(Nonexclusive|othercrap); 
di_device.Acquire(); 

if(di_device.GetKeyboardState()[Keys.LControl]) 
{ 
    blargh; 
} 

code écrit en SO zone de texte, non testé , quelque chose comme ca. Notez que vous devez inclure Microsoft.DirectX.DirectInput

Notez également que je ne veux pas dire que vous devriez init init un périphérique DirectInput chaque fois que vous avez besoin d'entrer. Créez l'appareil lorsque vous initiez votre jeu, éliminez-le lorsque votre programme se termine. DirectInput vous donne plus de contrôle ... Et les chances sont, vous allez vouloir l'utiliser. Bien sûr, à certains moments, vous devrez utiliser Winforms à la place [c'est-à-dire: pendant que votre programme est rendu, que se passe-t-il si l'utilisateur appuie assez rapidement sur un bouton? GKS ne vous le dira pas.]

Questions connexes