检查键是否是字母/数字/特殊符号

时间:2011-04-19 15:07:26

标签: c# key

我覆盖ProcessCmdKey,当我得到Keys参数时,我想检查这个Keys是字母还是数字还是特殊符号。

我有这个片段

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
            char key = (char)keyData;
            if(char.IsLetterOrDigit(key)
            {
                Console.WriteLine(key);
            }
            return base.ProcessCmdKey(ref msg, keyData);
    }

一切都适用于字母和数字。但是当我按下F1-F12时,它会将它们转换为字母。

也许有人知道更好的方法来解决这个问题?

6 个答案:

答案 0 :(得分:14)

改为覆盖表单的OnKeyPress方法。 KeyPressEventArgs提供KeyChar属性,允许您使用char上的静态方法。

正如Cody Gray在评论中所提到的,此方法仅触发具有角色信息的击键。 F1-F12等其他击键应在OnKeyDownOnKeyUp处理,具体视您的情况而定。

来自MSDN

  

以下是关键事件   顺序:

           

KeyPress事件未被引发   非字符键;然而   非字符键确实引发了KeyDown   和KeyUp事件。

示例

protected override void OnKeyPress(KeyPressEventArgs e)
{
  base.OnKeyPress(e);
  if (char.IsLetter(e.KeyChar))
  {
    // char is letter
  }
  else if (char.IsDigit(e.KeyChar))
  {
    // char is digit
  }
  else
  {
    // char is neither letter or digit.
    // there are more methods you can use to determine the
    // type of char, e.g. char.IsSymbol
  }
}

答案 1 :(得分:3)

尝试

if( !(keyData >= Keys.F1 && keyData <= Keys.F12))
{
    char key = (char)keyData;
    if(char.IsLetterOrDigit(key))
    {
        Console.WriteLine(key);
        return false;
    }

}
return base.ProcessCmdKey(ref msg, keyData);

答案 2 :(得分:1)

尝试使用keyData.KeyCode,甚至可以在一个范围内进行测试,而不是使用Char.IsLetterOrDigit。 e.g。

if (keyData.KeyCode >= Keys.D0 && keyData.KeyCode <= Keys.Z) {
  ...
}

答案 3 :(得分:0)

if (keyData >= Keys.F1 && keyData <= Keys.F12)
{
     //one of the key between F1~F12 is pressed
}

答案 4 :(得分:0)

你需要一个巨大的开关/案例陈述或检查范围。您可能会发现检查要排除的密钥更容易,具体取决于哪些密钥更少。查看所有可能的值。 http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx

if (keyData >= Keys.A && keyData <= Keys.Z)
   // do something

switch(keyData) {
case Keys.Add:
case Keys.Multiply:
// etc.
   // do something
   break;
}

答案 5 :(得分:-1)

我尝试过以下代码,但由于某些原因,char.IsLetter()方法将以下键识别为字母???

F1,F8,F9,F11,F12,RightShift,LeftShift,RightAlt,RightCtrl,LeftCtrl,LeftWin,RightWin,NumLock。

这种方法似乎并不完全证明它认为是一封信。

if(char.IsLetter((char)e.Key) || char.IsDigit((char)e.Key))