C # Detect Key Press, избегайте непечатных клавиш - PullRequest
3 голосов
/ 16 ноября 2010

Есть ли способ перейти в метод, если нажатая клавиша не приводит к какой-либо печати. то есть клавиша 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 ]

4 голосов
/ 16 ноября 2010
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) при необходимости. Вы понимаете, я не думаю, что здесь требуется регулярное выражение, как предлагали некоторые другие.

2 голосов
/ 16 ноября 2010

Значение 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

0 голосов
/ 29 апреля 2011

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

Я бы предложил использовать обработчик событий 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 и т. д. и вычислять из ключейкоторые нажимаются независимо от того, был ли изменен текст.

0 голосов
/ 16 ноября 2010

Возможно, вам будет полезно использовать регулярное выражение с «классом символов», указывающим непечатаемые символы.

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

...