2017-02-15 100 views
2

在Win窗體中使用C#過濾(或重新映射)richTextBox中的擊鍵(Ctrl-Shift-Z)最簡單的方法是什麼?我知道CodeProject上的各種鍵盤鉤子項目,但它們涉及整個類。我想盡可能使用最簡單的方法,比如一個函數覆蓋。原因是:richTextBox似乎將Ctrl-Shift-Z與Ctrl-Z相同,即作爲撤消。我寧願使用Ctrl-Shift-Z作爲重做。我嘗試了「KeyDown」方法,但它似乎沒有捕獲擊鍵,擊鍵似乎被處理得比這低。C#richTextBox過濾或重映射擊鍵

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或WPF? –

+0

WinForm(我將編輯原文) – MrSparkly

+0

我不想禁用快捷鍵,我只想讓Ctrl-Shift-Z像Ctrl-Y(重做)一樣工作。 – MrSparkly

回答

2

喜歡的東西:

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); 
} 

由於Hans Passant他回答說,你也應該檢查以確保您有窗體的KeyPreview屬性爲True。

+0

完美。正是我想要的。 – MrSparkly

+0

很高興爲您提供幫助。快樂的編碼! – Ethilium

1

在您的父窗體中,將KeyPreview屬性設置爲true,然後在窗體的KeyDown事件中查找所需的快捷方式。

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(); 
     } 
    } 
}