无法在 RichTextBox 中处理 Ctrl + S

Cannot handle Ctrl + S in RichTextBox

我正在为我的 winforms 应用程序的一部分编写一个文本编辑器。它具有常用的粗体、下划线、删除线、斜体工具栏按钮。但是,出于可访问性和工作流程效率的原因,我也想添加快捷方式。

相关代码如下:

private void TextInput_KeyDown(object sender, KeyEventArgs e)
{
    if(e.Control)
    {
        switch(e.KeyCode)
        {
            case Keys.B: ChangeFontStyle('B');
            break;
            case Keys.I: e.SuppressKeypress = true; 
            ChangeFontStyle('I');
            break;
            // ... the others (U and S) look like the one for B, with the matching letters... 
        }
        }
    }
}

private voide ChangeFontStyle(char targetStyle)
{
    switch(targetStyle)
    {
        case 'B': 
        if(TextInput.Selectionfont.Bold)
        { 
            TextInput.SelectionFont = new Font(TextInput.Selectionfont, TextInput.Selectionfont.Style ^ FontStyle.Bold);

        }
        else
        {
           TextInput.SelectionFont = new Font(TextInput.Selectionfont, TextInput.SelectionFont.Style | FontStyle.Bold);
        }
    }
}

其他的也是这样,分别是斜体、下划线和删除线。对于其中三个 itorks(尽管如果我不在 ctrl-I 上“e.SuppressKeyPress,则会在字体顶部设置一个缩进,变成斜体)。只是删除线不适用于 ctrl-S。使用 ctrl-shift -S 它有效,并且 case 'S' 块永远不会执行,因此 ctrl-S 必须以某种方式在某个地方被捕获并用于其他用途。但我绝对不会在其他地方使用它。建议?

当你在表单上有一个 MenuStrip 时,包括一个菜单项 Ctrl + S 作为 ShortcutKey, 然后 Ctrl + S 将被菜单项占用,您的控件将不会收到组合键。

KeyDown RichTextBox 的事件对于处理快捷键来说来不及了,MenuStrip 或父控件可能会消耗其 ProcessCmdKey 中的组合键。

要处理 RichTextBox 的快捷键,请使用以下选项之一:

  • 有一个MenuStrip包括一个ToolStripMenuItem分配给它的ShortcutKeys属性的快捷键,然后处理菜单项的Click事件:

    private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Handled by Save Menu");
    }
    
  • 覆盖FormProcessCmdKey方法:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.Control | Keys.S))
        {
            MessageBox.Show("Handled by Form");
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
    
  • 最后一个选项是使用 RichTextBoxPreviewKeyDown 事件:

    private void richTextBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyData == (Keys.Control | Keys.S))
        {
            e.IsInputKey = true;
            BeginInvoke(new Action(() => {
                MessageBox.Show("Handled by RichTextBox");
            }));
        }
    }