2017-02-15 5 views
2

En utilisant C#, dans un formulaire Win, quel est le moyen le plus simple de filtrer (ou remapper) une frappe (Ctrl-Maj-Z) dans un RichTextBox? Je connais divers projets de hook sur CodeProject, mais ils impliquent des classes entières. Je voudrais utiliser la méthode la plus simple possible, comme une fonction override. La raison: richTextBox semble traiter Ctrl-Shift-Z de la même manière que Ctrl-Z, c'est-à-dire Undo. Je préférerais utiliser Ctrl-Shift-Z comme Redo. J'ai essayé la méthode "KeyDown", mais il ne semble pas capturer la frappe, les frappes semblent être manipulées plus bas que cela.C# richTextBox filtre ou remappe une frappe

private void richTextBox_KeyDown(object sender, KeyEventArgs e) { 
    if (e.KeyCode == Keys.Z && Control.ModifierKeys == Keys.Shift && Control.ModifierKeys == Keys.Control) { 
     richTextBox.Redo(); 
    } 
} 
+0

WinForms ou WPF? –

+0

WinForm (Je vais modifier l'original) – MrSparkly

+0

Je ne veux pas désactiver les raccourcis, je veux juste que Ctrl-Shift-Z fonctionne comme Ctrl-Y (Redo). – MrSparkly

Répondre

2

Quelque chose comme:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
    if (keyData == (Keys.Control | Keys.Shift | Keys.Z)) { 
    richTextBox.Redo(); 
    return true; 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

Comme Hans Passant dit dans sa réponse, vous devriez également vérifier pour vous assurer que vous avez KeyPreview du formulaire propriété sur True.

+0

Parfait. Exactement ce que je voulais. – MrSparkly

+0

Content de vous aider. Codage heureux! – Ethilium

1

Dans votre formulaire parent, définissez la propriété KeyPreview true et recherchez le raccourci souhaité dans l'événement KeyDown du formulaire.

public partial class MyForm : Form 
{ 
    public MyForm() 
    { 
     InitializeComponent(); 
     this.KeyPreview = true; 
     this.KeyDown += MyForm_KeyDown; 
    } 

    private void MyForm_KeyDown(object sender, KeyEventArgs e) 
    { 
     if ((e.Modifiers & Keys.Shift) != 0 && 
      (e.Modifiers & Keys.Control) != 0 && 
      (e.KeyCode == Keys.Z)) 
     { 
      e.Handled = true; 
      richTextBox1.Redo(); 
     } 
    } 
}