C# Detect Key Press, избегайте непечатных клавиш

Есть ли способ перейти в метод, если нажатая клавиша не приводит к какой-либо печати. то есть клавиша Shift, клавиша управления и т. д. без указания всех из них. В идеале, чтобы определить комбинации клавиш, например, Control+V = Paste.

Код, аналогичный приведенному ниже, - это то, с чем я работаю;

    if( (e.KeyData == Keys.Left) 
        || (e.KeyData == Keys.Right) 
        || (e.KeyData == Keys.Home) 
        || (e.KeyData == Keys.End) 
        || (e.KeyData == Keys.Up) 
        || (e.KeyData == Keys.Down)
        || (e.KeyData == Keys.ShiftKey)
        || (e.KeyData == Keys.ControlKey)
        ) return;

Но не хочу добавлять каждую комбинацию нажатий клавиш.

Есть идеи?

4 ответа

protected override bool ProcessCmdKey( ref Message msg, Keys keyData )
{
  if ( keyData == (Keys.Control | Keys.V) )
    return true;
  else
    return base.ProcessCmdKey( ref msg, keyData );
}

Это заботится о копировании + вставке. Вы также можете переопределить OnKeyPress и использовать Char.IsDigit и / или Char.IsLetter (или Char.IsLetterOrDigit) при необходимости. Вы понимаете, я не думаю, что здесь требуется регулярное выражение, как предлагали некоторые другие.

Значение Keys содержит комбинации битов для всех нажатых клавиш... Это означает, что оно может иметь более одного значения в данный момент времени. Попробуй это:

if ( (keyData & Keys.Control) == Keys.Control && (keyData & Keys.V) == Keys.V) 
{ 
// Ctrl+V was pressed! 
} 

Итак, это будет определять комбинации клавиш... НО вам нужно будет указать их: s

Проверьте это: http://www.go4expert.com/forums/showthread.php?t=713

Это отвечает на вопрос, обратный вашему вопросу -"перейдите к методу, если нажатая клавиша не приводит к какой-либо печати", - но может получить то, что вы на самом деле пытаетесь выполнить, а не метод.

Я бы предложил использовать обработчик событий TextChanged в элементе управления TextBox/RichTextBox. Это срабатывает только тогда, когда текст действительно изменяется (будь то пользовательский набор или код).

private void richTextBox1_TextChanged(object sender, EventArgs e) {
    // Handle the event.
}

Если вы хотите узнать, когда пользователь изменил содержимое, вы можете использовать Modified свойство текстового поля.

if (richTextBox1.Modified) {
    // The user modified the contents of the text box.
}

Скорее всего, это будет гораздо надежнее, чем пытаться обрабатывать события KeyDown, KeyUp, KeyPress и т. Д. И вычислять с помощью нажатых клавиш, изменился ли текст.

Возможно, вам подойдет регулярное выражение с "классом символов", который обозначает непечатаемые символы.

Например, юникод " общая категория" для управляющих символов может работать ("Cc").

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