Estoy en busca de una mejor manera de implementar los accesos directos comunes del teclado de Windows (por ejemplo, Ctrl+ F, Ctrl+ N) en mi Windows Forms aplicación en C #.
La aplicación tiene un formulario principal que aloja muchos formularios secundarios (uno a la vez). Cuando un usuario presiona Ctrl+ F, me gustaría mostrar un formulario de búsqueda personalizado. El formulario de búsqueda dependerá del formulario secundario abierto actual en la aplicación.
Estaba pensando en usar algo como esto en el evento ChildForm_KeyDown :
if (e.KeyCode == Keys.F && Control.ModifierKeys == Keys.Control)
// Show search form
Pero esto no funciona. El evento ni siquiera se dispara cuando presionas una tecla. ¿Cuál es la solución?
c#
winforms
keyboard-shortcuts
Rockcoder
fuente
fuente
Respuestas:
Probablemente olvidó establecer la propiedad KeyPreview del formulario en True. Anular el método ProcessCmdKey () es la solución genérica:
fuente
KeyPreview
es bastante indispensable. Por ejemplo, al presionar un atajo es necesario suprimir la entrada pero, sin embargo, permitir que se active unMenuStrip
evento separado .ProcessCmdKey
enfoque forzaría la duplicación de la lógica de disparo de eventos.En su formulario principal
KeyPreview
en verdaderoAgregue el controlador de eventos KeyDown con el siguiente código
fuente
La mejor manera es usar la mnemotecnia del menú, es decir, tener entradas de menú en su formulario principal que tengan asignado el método abreviado de teclado que desee. Luego, todo lo demás se maneja internamente y todo lo que tiene que hacer es implementar la acción adecuada que se ejecuta en el
Click
controlador de eventos de esa entrada del menú.fuente
menu mnemonics
muestra real?Incluso puedes probar este ejemplo:
fuente
Si tiene un menú, entonces cambie la
ShortcutKeys
propiedad deToolStripMenuItem
debería hacer el truco.Si no, puede crear uno y establecer su
visible
propiedad en falso.fuente
Desde el formulario principal, debe:
Además, he encontrado esto en Google y quería compartirlo con aquellos que todavía están buscando respuestas. (para global)
Creo que tienes que estar usando user32.dll
Lea más esto http://www.fluxbytes.com/csharp/how-to-register-a-global-hotkey-for-your-application-in-c/
fuente
La respuesta de Hans podría ser un poco más fácil para alguien nuevo en esto, así que aquí está mi versión.
No necesita engañar
KeyPreview
, déjelo configuradofalse
. Para usar el código a continuación, simplemente péguelo debajo deform1_load
y ejecute F5para verlo funcionar:fuente
En WinForm, siempre podemos obtener el estado de la clave de control:
fuente