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
GetKeyState
función API.Keyboard.Modifiers == ModifierKeys.Shift
(para aquellos que vinieron aquí en una búsqueda)(Control.ModifierKeys & Keys.Shift) != 0
uno 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
GetKeyState
Serí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.Input
existe para otros que luchan con esto, necesita agregar una referenciaPresentationCore
y una referencia adicionalWindowsBase
para acceder a laSystem.Windows.Input.Key
enumeración. Esta información siempre se puede encontrar en MSDN.static
, noabstract
.Desde .NET Framework versión 3.0, es posible usar el
Keyboard.IsKeyDown
método desde el nuevoSystem.Windows.Input
espacio 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.IsKeyDown
mé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.IsKeyDown
mé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
Keyboard
no fue reconocido por el compilador, peroGetAsyncKeystate
en 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
Form
propiedad 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