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").