2010-05-07 2 views
12

In meiner Windows Forms-Anwendung möchte ich eine spezielle Schaltfläche, um einen Test jedes Mal auszuführen, wenn ich es drücke. Es gibt Dutzende von Steuerelementen, so dass es zu viel Zeit in Anspruch nimmt.Hotkey (nicht global) in Windows Forms .NET

Gibt es einen Weg, ich kann einen Hotkey so einstellen, egal was ich in der Anwendung mache, kann ich die Taste drücken, und es wird mein Ereignis auslösen?

Antwort

15

können Sie ProcessCmdKey außer Kraft setzen und Ihre Hotkeys dort behandeln, entweder in einer Steuerung oder ein Formular.

Von MSDN:

Die ProcessCmdKey Methode zuerst bestimmt, ob das Steuerelement ein ContextMenu, und wenn das so ist, ermöglicht es die ContextMenu den Befehl Schlüssel zu verarbeiten. Wenn die Befehlstaste kein Menü ist Verknüpfung und das Steuerelement hat einen übergeordneten, der Schlüssel an die ProcessCmdKey-Methode des übergeordneten übergeben wird. Der Nettoeffekt ist, dass Befehlsschlüssel bis die Kontrollhierarchie "sprudeln". Zusätzlich zu die Taste, die der Benutzer gedrückt hat, zeigt die Schlüsseldaten auch an, welche, falls überhaupt, Modifikator Tasten gleichzeitig gedrückt wurden als der Schlüssel. Modifikatortasten enthalten die Tasten UMSCHALTTASTE, STRG und ALT.

Zum Beispiel:

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

Wenn Sie nur ein Formular haben. Sie können Form.KeyPreview = true festlegen und dann Code zum Schlüsselereignis des Formulars hinzufügen.

4

Sie können die ProcessCmdKey() - Methode eines Formulars überschreiben. Sie wird ausgeführt, bevor ein Steuerelement im Formular den Schlüsselstrich anzeigt. Wenn Sie dies wirklich auf der Anwendungsebene (allen Formularen) benötigen, sollten Sie Ihr Hauptformular die IMessageFilter-Schnittstelle implementieren. Zum Beispiel:

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

ich dieses hatte markiert akzeptieren, aber dann sah ich zach schreiben 'Rückkehr base.ProcessCmdKey (ref msg, keyData);' und ich fühlte mich wie ein Idiot (Ich benutze das, aber ich ignoriere dieses Mal) und habe meinen Code aktualisiert. Er bekommt es, weil seine Antwort mich an meinen Fehler erinnert. Obwohl Sie mehr Antworten hatten. Es war eine schwere Entscheidung. –