C# текстовое поле отключить ярлыки

Я использую текстовое поле внутри приложения Windows Form, и мне нужно отключить сочетания клавиш CTRL+I и CTRL+H. Я пробовал много разных решений, которые я нашел через Google, но это не сработает.

Я уже использую CTRL+I в качестве пользовательского ярлыка в своем приложении, и я не хочу, чтобы эта команда вставляла табуляцию в моё текстовое поле. По какой причине CTRL+H действует как нажатие delete?

Если я установил "Горячие клавиши включены" в false в свойствах элемента управления, то CTRL+I и CTRL+H все еще работают. CTRL+C или CTRL+V отключены. Я ожидал бы, что все ярлыки отключены, если я установил "Ярлыки включены" в false.

Я попробовал следующий код, который я нашел где-то, но это также не мешает CTRL+I или CTRL+H

    private void textBoxComment_KeyDown(object sender, KeyEventArgs e)
    {
        if ( e.Modifiers == Keys.Control )
        {
            switch(e.KeyCode)
            {
                case Keys.C:
                case Keys.X:
                case Keys.V:
                case Keys.Z:
                case Keys.I:
                case Keys.H:
                e.Handled = true;
                break;
                default:
                break;
            }
        }
    }

3 ответа

Попробуйте переопределить ProcessCmdKey функция:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
   if ((keyData & Keys.Control) > 0 && (keyData & Keys.KeyCode) == Keys.V)
   {
       return true;
   }
   return base.ProcessCmdKey(ref msg, keyData);
}

Это могло помочь. У меня есть ToolStripMenu с несколькими элементами, у которых есть ShorcutKeys. Я хотел остановить их функциональность, пока в фокусе находится любой TextBox. Это сработало для меня

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (ActiveControl is TextBox)
        {
            foreach (ToolStripMenuItem item in menu.DropDownItems)
            {
                if (item.ShortcutKeys == Keys.None) continue;

                if (item.ShortcutKeys == keyData)
                {
                    item.ShortcutKeys = Keys.None;

                    var ret = base.ProcessCmdKey(ref msg, keyData);

                    item.ShortcutKeys = keyData;

                    return ret;
                }
            }
        }

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

Попробуйте добавить e.SuppressKeyPress = true также:

private void textBoxComment_KeyDown(object sender, KeyEventArgs e)
{
    if ( e.Modifiers == Keys.Control )
    {
        switch(e.KeyCode)
        {
            case Keys.C:
            case Keys.X:
            case Keys.V:
            case Keys.Z:
            case Keys.I:
            case Keys.H:
            e.Handled = true;
            e.SuppressKeyPress = true;
            break;
            default:
            break;
        }
    }
}

Используйте свойство shortcutsenabled, чтобы вы могли более избирательно исключать сочетания клавиш мыши и клавиатуры.

TextBox.ShortcutsEnabled = false;

Ссылка msdn Используйте свойство ShortcutsEnabled, чтобы включить или отключить следующие сочетания клавиш и контекстное меню элемента управления: CTRL+Z CTRL+E CTRL+C CTRL+Y CTRL+X CTRL+BACKSPACE CTRL+V CTRL+DELETE CTRL+A SHIFT+ УДАЛИТЬ CTRL+L SHIFT+ ВСТАВИТЬ CTRL + R

Другие вопросы по тегам