C#检测按键,避免使用非键入键

时间:2010-11-16 04:13:56

标签: c# rtf key typing keystroke

如果正在按下的键不导致任何输入,是否有任何方法可以进入方法。即移位键,控制键等,而不必指定它们全部。理想情况下,要检测键的组合,例如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 个答案:

答案 0 :(得分: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)。你明白这个想法,我认为正如其他人所建议的那样,正规表达是不合理的。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

这回答了你的问题的反面 - “如果正在按的键不会导致任何输入,则进入方法” - 但可能会得到你实际尝试的内容完成,而不是方法。

我建议在TextBox / RichTextBox控件上使用TextChanged事件处理程序。这只是在文本实际更改时被触发(无论是来自用户输入还是来自代码)。

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等事件更加可靠,并且可以从按下的键中找出文本是否发生变化。

答案 3 :(得分:-1)

也许你的目的是使用正则表达式,其中“字符类”表示不可打印的字符。

例如,控制字符的unicode“general category”可能有效('抄送')。