Dans Windows Forms , vous pouvez connaître, à tout moment, la position actuelle du curseur grâce à la classe Cursors .
La même chose ne semble pas être disponible pour le clavier. Est-il possible de savoir si, par exemple, la Shifttouche est enfoncée?
Est-il absolument nécessaire de retrouver chaque notification clavier (événements KeyDown et KeyUp)?
Réponses:
Cela sera également vrai si Ctrl+ Shiftest en panne. Si vous voulez vérifier si Shift seul est enfoncé,
Si vous êtes dans une classe qui hérite
Control
(comme un formulaire), vous pouvez supprimer leControl.
la source
GetKeyState
fonction API.Keyboard.Modifiers == ModifierKeys.Shift
(pour ceux qui sont venus ici lors d'une recherche)(Control.ModifierKeys & Keys.Shift) != 0
un peut utiliserControl.ModifierKeys.HasFlag(Keys.Shift)
Le code ci-dessous explique comment détecter presque toutes les touches actuellement enfoncées, pas seulement la Shifttouche.
la source
GetKeyState
serait plus efficace. Il ne sert à rien de suivre toutes les clés lorsque Windows le fait déjà pour vous.Vous pouvez également consulter les éléments suivants si vous utilisez WPF ou référencez System.Windows.Input
L'espace de noms Keyboard peut également être utilisé pour vérifier l'état enfoncé d'autres touches avec Keyboard.IsKeyDown (Key), ou si vous vous abonnez à un KeyDownEvent ou à un événement similaire, les arguments d'événement contiennent une liste des touches actuellement enfoncées.
la source
La plupart de ces réponses sont soit beaucoup trop compliquées, soit ne semblent pas fonctionner pour moi (par exemple, System.Windows.Input ne semble pas exister). Ensuite, j'ai trouvé un exemple de code qui fonctionne bien: http://www.switchonthecode.com/tutorials/winforms-accessing-mouse-and-keyboard-state
Au cas où la page disparaîtrait à l'avenir, je poste le code source pertinent ci-dessous:
la source
System.Windows.Input
existe; pour les autres, vous devez ajouter une référence àPresentationCore
et une référence supplémentaire àWindowsBase
pour accéder à l'System.Windows.Input.Key
énumération. Cette information peut toujours être trouvée sur MSDN.static
, nonabstract
.Depuis .NET Framework version 3.0, il est possible d'utiliser la
Keyboard.IsKeyDown
méthode à partir du nouvelSystem.Windows.Input
espace de noms. Par exemple:Même si elle fait partie de WPF, cette méthode fonctionne bien pour les applications WinForm (à condition que vous ajoutiez des références à PresentationCore.dll et WindowsBase.dll ). Malheureusement, les versions 3.0 et 3.5 de la
Keyboard.IsKeyDown
méthode ne fonctionnaient pas pour les applications WinForm. Par conséquent, si vous souhaitez l'utiliser dans une application WinForm, vous devez cibler .NET Framework 4.0 ou version ultérieure pour qu'il fonctionne.la source
Keyboard.IsKeyDown
méthode fonctionne, même dans un projet WinForm.Vous pouvez P / Invoke jusqu'à Win32 GetAsyncKeyState pour tester n'importe quelle touche du clavier.
Vous pouvez passer des valeurs de l'énumération Keys (par exemple Keys.Shift) à cette fonction, donc il ne faut que quelques lignes de code pour l'ajouter.
la source
Keyboard
n'a pas été reconnu par le compilateur, maisGetAsyncKeystate
dans user32 a très bien fonctionné. Merci!la source
Le meilleur moyen que j'ai trouvé pour gérer l'entrée au clavier sur un formulaire Windows Forms est de le traiter après la frappe et avant que le contrôle ciblé ne reçoive l'événement. Microsoft gère une
Form
propriété de niveau intégrée nommée .KeyPreview pour faciliter cette opération précise:Ensuite, les événements _KeyDown, _KeyPress et / ou _KeyUp du formulaire peuvent être marshalés pour accéder aux événements d'entrée avant que le contrôle de formulaire focalisé ne les voit, et vous pouvez appliquer la logique du gestionnaire pour capturer l'événement là-bas ou lui permettre de passer au contrôle de formulaire ciblé .
Bien que pas aussi structurellement gracieux que l' architecture de routage d' événements de XAML , il simplifie beaucoup la gestion des fonctions au niveau du formulaire dans Winforms. Consultez les notes MSDN sur KeyPreview pour les mises en garde.
la source
fonctionne pour une zone de texte si le code ci-dessus est dans l'événement keydown du formulaire et qu'aucun autre contrôle ne capture l'événement keydown pour la touche down.
On peut également souhaiter arrêter le traitement des clés avec:
la source
La position x / y du curseur est une propriété et une pression sur une touche (comme un clic de souris / souris) est un événement. La meilleure pratique consiste généralement à laisser l'interface être pilotée par les événements. À peu près le seul moment où vous auriez besoin de ce qui précède est si vous essayez de faire une opération shift + souris.
la source
Dans WinForms:
Cela ressemble à un doublon de la question de débordement de pile. Détecter la touche Shift est enfoncée sans utiliser d'événements dans Windows Forms? .
la source