C#检测按键,避免非打字按键

3

如果按下的键不会产生任何输入,例如shift键、control键等,是否有办法进入方法而无需指定所有这些键。理想情况下,可以检测按键组合,例如Control+V = 粘贴。

我正在使用类似以下代码的东西;

    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
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
键值包含所有按下的键的位组合...这意味着它在给定时间可能有多个值。试试这个:
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

如果这样怎么样:if (keyData == (Keys.Control | Keys.V))。至少更简洁了。 - Ed S.
@Ed 即使它可能有用,但并不完全相同。Faizan 的传递使用 Ctrl+V 和 Ctrl+Alt+V,而你的仅使用 Ctrl+V 传递。 - R. Martinho Fernandes
不确定您正在查看哪个代码,但我没有看到ALT的检查。我只看到对Control和V进行了单独的检查。 - Ed S.
@Ed:但如果同时按下Ctrl和Alt和V,Faizan的检查会通过,因为同时按下了Ctrl和V。而你的检查不会通过,因为并不是完全按下了Ctrl和V。Faizan的检查是“至少”,而你的检查是“完全”。不确定OP更喜欢哪种方式,只是指出了差异。 - R. Martinho Fernandes
不错的,Ed... 相当有用,用于检查确切的数值 :) - Faizan Kazi

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等事件,并从按下的键中确定文本是否更改要可靠得多。


-1
也许你可以使用一个正则表达式,其中包含表示非可打印字符的“字符类”,以此来实现你的目的。
例如,unicode "general category" 中的控制字符可能是个不错的选择('Cc')。

有些事件不提供字符,而是键码或“按键”。Ctrl+V恰好是控制字符(又称^V),但Ctrl+Alt+V不是。 - R. Martinho Fernandes
1
是的,很多人在问题实际上可以用更传统的方式解决时就会转向正则表达式。 - Ed S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接