2010-05-07 17 views
12

En mi aplicación Windows Forms, me gustaría un botón especial para ejecutar una prueba cada vez que lo presiono. Hay docenas de controles, por lo que su implementación en cada uno lleva demasiado tiempo.Tecla de acceso rápido (no global) en Windows Forms .NET

¿Hay alguna manera de configurar una tecla de acceso directo, así que, sin importar lo que esté haciendo en la aplicación, puedo presionar la tecla y se activará mi evento?

Respuesta

15

Puede anular ProcessCmdKey y manejar sus teclas de acceso rápido allí, ya sea en un control o una forma.

De MSDN:

El método ProcessCmdKey primera determina si el control tiene un ContextMenu, y si es así, permite que el ContextMenu para procesar la tecla de comando . Si la clave de comando no es un atajo de menú y el control tiene una matriz, , la clave se pasa al método ProcessCmdKey del padre. El efecto neto es que las teclas de comando están "burbujeadas" hacia arriba la jerarquía de control. Además de la tecla presionada por el usuario, la clave de datos también indica cuáles teclas modificadoras se presionaron al mismo tiempo que la tecla. Las teclas modificadoras incluyen las teclas SHIFT, CTRL y ALT .

Por ejemplo:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    // if it is a hotkey, return true; otherwise, return false 
    switch (keyData) 
    { 
     case Keys.Control | Keys.C: 
      // do something 
      return true; 
     default: 
      break; 
    } 

    return base.ProcessCmdKey(ref msg, keyData); 
} 
1

Si solo tiene un formulario. Puede establecer Form.KeyPreview = true y luego agregar código al evento clave del formulario.

4

Puede anular el método ProcessCmdKey() de un formulario, se ejecuta antes de que cualquier control en el formulario vea el trazo de tecla. Si realmente necesita que esto esté en el nivel de la aplicación (todos los formularios), entonces debe hacer que su formulario principal implemente la interfaz IMessageFilter. Por ejemplo:

public partial class Form1 : Form, IMessageFilter { 
    public Form1() { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
     this.FormClosed += (o, e) => Application.RemoveMessageFilter(this); 
    } 
    public bool PreFilterMessage(ref Message m) { 
     // Catch WM_KEYDOWN message 
     if (m.Msg == 0x100 && (Keys)m.WParam == Keys.F1) { 
      MessageBox.Show("Help me!"); 
      return true; 
     } 
     return false; 
    } 
} 
+0

ProcessCmdKey FTW –

+0

que tenía éste marcó aceptar, pero luego vi zach escribir 'volver base.ProcessCmdKey (ref msg, keyData);' y me sentí como un idiota (utilizo para hacer eso pero esta vez no lo sé) y actualicé mi código. Lo entiende por tener su respuesta que me recuerda mi error. Aunque tuviste más respuestas. Fue una elección difícil. –

Cuestiones relacionadas