在KeyDown事件上筛选KeyCodes的更有效方法

时间:2011-05-12 19:58:28

标签: c# events key keydown keycode

当用户尝试使用KeyDown事件尝试仅将有用数据输入到表单字段时,我正尝试触发事件执行某些工作。但是,我不断收到错误警报,因为KeyDown事件适用于任何密钥!

我正在尝试不要为“Alt,Control,Shift,Esc,F键等”按钮触发事件。这样做的最佳方式是什么?

到目前为止我所拥有的是:

    private void formControl_KeyModified(object sender, KeyEventArgs e)
    {
        if (e.KeyCode != Keys.Shift && e.KeyCode != Keys.CapsLock && e.KeyCode != Keys.Tab && e.KeyCode != Keys.Escape &&
            e.KeyCode != Keys.Insert && e.KeyCode != Keys.Home && e.KeyCode != Keys.End && e.KeyCode != Keys.PageUp &&
            e.KeyCode != Keys.PageDown && e.KeyCode != Keys.Up && e.KeyCode != Keys.Down && e.KeyCode != Keys.Left &&
            e.KeyCode != Keys.Right && e.KeyCode != Keys.Control && e.KeyCode != Keys.Alt && e.KeyCode != Keys.NumLock &&
            e.KeyCode != Keys.Insert && e.KeyCode != Keys.None && e.KeyCode != Keys.PrintScreen && e.KeyCode != Keys.Help &&
            e.KeyCode != Keys.ControlKey && e.KeyCode != Keys.ShiftKey && e.KeyCode != Keys.Sleep && e.KeyCode != Keys.LWin &&
            e.KeyCode != Keys.RWin && e.KeyCode != Keys.RMenu && e.KeyCode != Keys.LMenu && e.KeyCode != Keys.LShiftKey &&
            e.KeyCode != Keys.RShiftKey && e.KeyCode != Keys.Pause && e.KeyCode != Keys.F1 && e.KeyCode != Keys.F2 &&
            e.KeyCode != Keys.F3 && e.KeyCode != Keys.F4 && e.KeyCode != Keys.F5 && e.KeyCode != Keys.F6 && e.KeyCode != Keys.F7 &&
            e.KeyCode != Keys.F8 && e.KeyCode != Keys.F9 && e.KeyCode != Keys.F10 && e.KeyCode != Keys.F11 && e.KeyCode != Keys.F12 &&
            e.KeyCode != Keys.L)
        {
             // Do some work...
        }
    }

但是,这似乎不是解决这个问题的最好方法。 同样,我只是想获取可以输入文本框的字符的键(例如213135udf!@#%@!#@#%15nfaosdf〜!@} {:?&gt ;, 等等)!任何帮助都将不胜感激,谢谢!

此致 艾萨克D.

(为清晰度和质量而编辑)

5 个答案:

答案 0 :(得分:1)

您可以将所有值都放入HashSet<T>并检查KeyCode是否在集合中。

var invalidKeys = new HashSet<Keys> { Keys.Shift, Keys.CapsLock, Keys.Tab, ... Keys.L };
if (!invalidKeys.Contains(e.KeyCode))
{
    // Do some work...
}

或者,由于您正在检查是否相等,所以您可以将所有内容都放入switch语句中。

switch (e.KeyCode)
{
case Keys.Shift:
case Keys.CapsLock:
case Keys.Tab:
// ...
case Keys.L:
    break;
default:
    // Do some work...
    break;
}

答案 1 :(得分:1)

你可以举例说(有许多好的尝试)检查this page以获取Char类的帮助,你可以使用IsLetterOrDigit等方法或其他函数。现在我无法识别您是否使用Windows窗体?如果是这样,请使用像(char)e.KeyCode这样的简单演员来获取字符。

示例:

private void formControl_KeyModified(object sender, KeyEventArgs e)
{
    char c = (char)e.KeyCode;
    if (Char.IsLetterOrDigit(c)) {
        // useful
    }
    // might add more checks
    // else if (Char.IsPunctuation(c)) ...
}

答案 2 :(得分:0)

您可以处理表单的KeyPress事件。上述事件将KeyPressEventArgs作为其参数参数。

使用Char.IsLetterOrDigit函数检查KeyPressEventArgs.KeyChar属性的值。

private void form_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{

     if (char.IsLetterOrDigit(e.KeyChar)) {}
     else { e.Handled = false; }

}

修改

您还可以尝试列出已接受的Char值列表,然后检查其中是否包含预置字符:

private void form_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{

     List<Char> charList = new List<Char>;
     charList.AddRange(new Char[] { 'a', 'b' ... });

     if (charList.Contains(e.KeyChar)) {}
     else { e.Handled = false; }

}

您可能需要考虑两种方式相结合,甚至更多来满足您的要求。

答案 3 :(得分:0)

如果您关心if语句的执行时间,请创建Key值的SortedList并检查SortedList是否包含您的密钥。

一个可能更好的解决方案是使用Forms TextBox“TextChanged”事件而不是使用KeyDown事件。

答案 4 :(得分:0)

就像@Daniel在他的评论中所述,或许白名单上的有效密钥优于黑名单所有那些你不感兴趣的内容。因此,假设您只对字母键和数字感兴趣,就可以像the msdn Keys example

中描述的那样进行操作。
if(e.KeyCode > Keys.NumPad0 && e.KeyCode < Keys.NumPad9 ||
   e.KeyCode > Keys.D0 && e.KeyCode < Keys.D9 ||
   e.KeyCode > Keys.A && e.KeyCode < Keys.Z) {

    //do useful stuff here
}