¿La mejor manera de implementar atajos de teclado en una aplicación de Windows Forms?

Resuelto Rockcoder asked hace 15 años • 9 respuestas

Estoy buscando la mejor manera de implementar atajos de teclado comunes de Windows (por ejemplo Ctrl+ F, Ctrl+ N) en mi aplicación Windows Forms en C#.

La aplicación tiene un formulario principal que alberga 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 actualmente 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 activa cuando presionas una tecla. ¿Cuál es la solución?

Rockcoder avatar Dec 30 '08 19:12 Rockcoder
Aceptado

Probablemente olvidó establecer la propiedad KeyPreview del formulario en True. Anular el método ProcessCmdKey() es la solución genérica:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
  if (keyData == (Keys.Control | Keys.F)) {
    MessageBox.Show("What the Ctrl+F?");
    return true;
  }
  return base.ProcessCmdKey(ref msg, keyData);
}
Hans Passant avatar Dec 30 '2008 14:12 Hans Passant

En tu formulario principal

  1. Establecer KeyPreviewen verdadero
  2. Agregue el controlador de eventos KeyDown con el siguiente código

    private void MainForm_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.N)
        {
            SearchForm searchForm = new SearchForm();
            searchForm.Show();
        }
    }
    
Almir avatar Aug 04 '2011 07:08 Almir

La mejor manera es utilizar mnemónicos de menú, es decir, tener entradas de menú en su formulario principal a las que se les asigne el método abreviado de teclado que desee. Luego, todo lo demás se maneja internamente y todo lo que tienes que hacer es implementar la acción apropiada que se ejecuta en el Clickcontrolador de eventos de esa entrada del menú.

Konrad Rudolph avatar Dec 30 '2008 12:12 Konrad Rudolph