0

当用户尝试使用 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~!@}{:?> 等等)!任何帮助将不胜感激,谢谢!

此致,艾萨克 D.

(为清晰和质量而编辑)

4

5 回答 5

1

您可以将所有值放入 aHashSet<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;
}
于 2011-05-12T20:08:47.773 回答
1

例如,您可以(有很多很好的尝试)检查此页面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)) ...
}
于 2011-05-12T20:10:49.227 回答
0

您可以处理表单的KeyPress事件。提到的事件将KeyPressEventArgs作为其 arguments 参数。

使用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; }

}

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

于 2011-05-12T20:12:20.257 回答
0

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

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

于 2011-05-12T20:12:25.073 回答
0

就像@Daniel 在他的评论中所说,也许将有效密钥列入白名单比将所有你不感兴趣的密钥列入黑名单更可取。因此,假设您只对字母键和数字感兴趣,您可以按照 msdn Keys 示例中的说明进行操作

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
}
于 2011-05-12T20:55:47.407 回答