En Windows Forms , puede saber, en cualquier momento, la posición actual del cursor gracias a la clase Cursores .
Lo mismo no parece estar disponible para el teclado. ¿Es posible saber si, por ejemplo, Shiftse presiona la tecla?
¿Es absolutamente necesario rastrear cada notificación de teclado (eventos KeyDown y KeyUp)?

Respuestas:
Esto también será cierto si Ctrl+ Shiftestá abajo. Si desea verificar si se presiona Shift solo,
Si está en una clase que hereda
Control(como un formulario), puede eliminar elControl.fuente
GetKeyStatefunción API.Keyboard.Modifiers == ModifierKeys.Shift(para aquellos que vinieron aquí en una búsqueda)(Control.ModifierKeys & Keys.Shift) != 0uno puede usarControl.ModifierKeys.HasFlag(Keys.Shift)El siguiente código es cómo detectar casi todas las teclas presionadas actualmente, no solo la Shifttecla.
fuente
GetKeyStateSería más eficiente. No tiene sentido rastrear todas las claves cuando Windows ya lo hace por usted.También puede ver lo siguiente si hace referencia a System.Windows.Input
El espacio de nombres del teclado también se puede usar para verificar el estado presionado de otras teclas con Keyboard.IsKeyDown (Key), o si se está suscribiendo a un evento KeyDownEvent o similar, los argumentos del evento llevan una lista de las teclas presionadas actualmente.
fuente
La mayoría de estas respuestas son demasiado complicadas o no parecen funcionar para mí (por ejemplo, System.Windows.Input no parece existir). Luego encontré un código de muestra que funciona bien: http://www.switchonthecode.com/tutorials/winforms-accessing-mouse-and-keyboard-state
En caso de que la página desaparezca en el futuro, estoy publicando el código fuente relevante a continuación:
fuente
System.Windows.Inputexiste para otros que luchan con esto, necesita agregar una referenciaPresentationCorey una referencia adicionalWindowsBasepara acceder a laSystem.Windows.Input.Keyenumeración. Esta información siempre se puede encontrar en MSDN.static, noabstract.Desde .NET Framework versión 3.0, es posible usar el
Keyboard.IsKeyDownmétodo desde el nuevoSystem.Windows.Inputespacio de nombres. Por ejemplo:Aunque es parte de WPF, ese método funciona bien para aplicaciones WinForm (siempre que agregue referencias a PresentationCore.dll y WindowsBase.dll ). Desafortunadamente, sin embargo, las versiones 3.0 y 3.5 del
Keyboard.IsKeyDownmétodo no funcionaron para las aplicaciones WinForm. Por lo tanto, si desea usarlo en una aplicación WinForm, tendrá que apuntar a .NET Framework 4.0 o posterior para que funcione.fuente
Keyboard.IsKeyDownmétodo funciona, incluso en un proyecto WinForm.Puede P / Invocar hasta Win32 GetAsyncKeyState para probar cualquier tecla del teclado.
Puede pasar valores desde la enumeración Keys (por ejemplo, Keys.Shift) a esta función, por lo que solo se requieren un par de líneas de código para agregarla.
fuente
Keyboardno fue reconocido por el compilador, peroGetAsyncKeystateen user32 funcionó bien. ¡Gracias!fuente
La mejor manera que he encontrado para administrar la entrada del teclado en un formulario de Windows Forms es procesarla después de presionar la tecla y antes de que el control enfocado reciba el evento. Microsoft mantiene una
Formpropiedad de nivel incorporado llamada .KeyPreview para facilitar esto:Luego, los eventos _KeyDown, _KeyPress y / o _KeyUp del formulario se pueden ordenar para acceder a los eventos de entrada antes de que el control de formulario enfocado los vea, y puede aplicar la lógica del controlador para capturar el evento allí o permitir que pase al control de formulario enfocado .
Aunque no es tan estructuralmente elegante como la arquitectura de enrutamiento de eventos de XAML , hace que la administración de las funciones de nivel de formulario en Winforms sea mucho más simple. Consulte las notas de MSDN en KeyPreview para ver las advertencias.
fuente
funciona para un cuadro de texto si el código anterior está en el evento keydown del formulario y ningún otro control captura el evento keydown para la tecla down.
También es posible que desee detener el procesamiento de claves adicionales con:
fuente
La posición del cursor x / y es una propiedad, y una pulsación de tecla (como un clic del mouse / movimiento del mouse) es un evento. La mejor práctica suele ser dejar que la interfaz sea controlada por eventos. Casi la única vez que necesitaría lo anterior es si está tratando de hacer una cosa shift + mouseclick.
fuente
En WinForms:
Suena como un duplicado de la pregunta de desbordamiento de pila ¿ Se presiona la tecla Detectar Shift sin usar eventos en Windows Forms? .
fuente