visual studio net form evento .net winforms keyboard-shortcuts

.net - studio - ¿Cómo creo atajos de teclado compuesto en una aplicación de Windows Forms?



onkeypress c# textbox (5)

Utilice el evento OnKeyPressed del formulario y compruebe si se presionó la combinación de teclas deseada en el argumento eventArgs

Quiero crear un componente que nos permita tener atajos de teclado compuestos asociados con un comando arbitrario, como el Visual Studio IDE y Microsoft Office.

Es decir, atajos de teclado que consisten en una secuencia de múltiples pulsaciones de teclas, como Ctrl + W + C. En Visual Studio esto abre la vista de clase. Cuando se presiona el primer conjunto de teclas ( Ctrl + W ) aparece el mensaje "(Ctrl + W) Esperando la segunda tecla del acorde ..." en la barra de estado.


Los controles de menú tienen una propiedad llamada ShortCut donde puede asignar un valor. Cuando presione esa tecla de acceso directo, se invocará ese elemento del menú. Use esa propiedad para los comandos que tiene un menú correspondiente.

Si necesita accesos directos que no estarán disponibles en los menús, entonces deberá manejarlos por medio de los eventos KeyUp o KeyDown , ya sea en el formulario o en el control. Se pasará un objeto KeyEventArgs a su controlador, y puede verificar qué tecla se presiona y si también se presionaron las teclas Ctrl, Alt o Shift.

Código de muestra de MSDN:

// Handle the KeyDown event to determine the type of character entered into the control. private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { // Initialize the flag to false. nonNumberEntered = false; // Determine whether the keystroke is a number from the top of the keyboard. if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9) { // Determine whether the keystroke is a number from the keypad. if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9) { // Determine whether the keystroke is a backspace. if(e.KeyCode != Keys.Back) { // A non-numerical keystroke was pressed. // Set the flag to true and evaluate in KeyPress event. nonNumberEntered = true; } } } //If shift key was pressed, it''s not a number. if (Control.ModifierKeys == Keys.Shift) { nonNumberEntered = true; } }


Además de algunas de las respuestas, el uso de un símbolo comercial en el título de un botón o elemento del menú hará que esté subrayado, y se puede acceder usando Alt + la letra precedida por el signo &.

En otras palabras, si tiene un elemento de menú con subtítulos y Archivo , se mostrará con un subrayado debajo de la F y el usuario puede activar el menú haciendo clic en Alt + F.


Depende del alcance del atajo de teclado. Si desea utilizar un atajo de teclado desde cualquier control en el Formulario sin usar una barra de herramientas, configure

Form.KeyPreview = true;

en forma. Esto permitirá que todos los eventos de pulsación de tecla se filtren mediante los eventos KeyPress , KeyDown y KeyUp en el nivel de formulario, lo que permitirá manejar un atajo de teclado único en una ubicación en lugar de duplicar la funcionalidad en todos los controles de usuario.

MSDN: Propiedad Form.KeyPreview


En respuesta a la pregunta de los acordes de teclado específicamente, no creo que haya una opción lista para ti disponible en este punto.

Sin embargo, debería ser lo suficientemente simple como para modelar. Crearía una sola clase, tal vez KeyboardChordProvider . Tendrá que saber sobre eventos de teclado en el nivel de formulario. Como se indicó en otro lugar, la propiedad Form.KeyPreview debe ser true . Puede ser suficiente para este proveedor suscribirse al evento Form.KeyPress . Puedes hacer todo esto en el constructor del proveedor si pasaste el formulario.

Debería registrar las posibles combinaciones de teclas con el proveedor.

Internamente, esta instancia rastreará el estado actual. Cada vez que se observe una pulsación de tecla que represente la primera clave del acorde, actualizará el estado del proveedor y generará un evento para que un suscriptor pueda configurar el texto: (CTRL + W) se presionó. Esperando la segunda clave de acorde ...

Si la siguiente pulsación coincide con una posible opción secundaria, entonces tiene una coincidencia y podría generar un evento ChordPressed que contenga los detalles de los trazos ingresados. Alternativamente, puede simplemente llamar a una devolución de llamada particular que se le dio al proveedor en el momento en que se registró el acorde (para evitar tener una declaración de cambio u otro envío en el controlador de eventos ChordPressed ).

Si, en cualquier momento, una pulsación de tecla no coincide con una posible próxima opción, entonces restablecería el estado del proveedor.

De manera interna para el proveedor, puede modelar las posibles combinaciones de teclas usando una estructura de árbol. El estado actual del proveedor es solo un nodo de árbol particular. Al principio, el nodo raíz estaría activo. Si un niño coincide con una pulsación de tecla, se convierte en el nodo actual en previsión del siguiente trazo. Si el niño era un nodo hoja, entonces un acorde completo ha coincidido y usted elevaría el evento ChordPressed (pasando la cadena de trazos que lo llevaron a ese punto) o invocar la devolución de llamada almacenada en la hoja. Siempre que ninguna combinación de teclas coincida con un elemento secundario, reinicie de nuevo para activar el nodo raíz.

Creo que este diseño logrará lo que quieres.