【问题标题】:Check if Keys is Letter/Digit/Special Symbol检查键是否是字母/数字/特殊符号
【发布时间】:2011-08-08 18:42:47
【问题描述】:

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

我有这个sn-p

    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 时,它会将它们转换为字母。

也许有人知道解决此任务的更好方法?

【问题讨论】:

  • 问题是你将keyData 转换为一个角色。你不能那样做。您必须使用Keys 枚举中定义的常量来获取此信息。
  • 查看Keys 枚举的值,确实最初认为“这些枚举值是字符代码”。但是进一步考虑这是不可能的,因为a)有些键没有字符,例如Sleep 和 b) 也有共享相同字符的键,例如D0NumPad0:即使它们具有相同的字符 0,它们也不能共享相同的枚举值,因为那样它们将无法区分,因此它们中至少有一个映射到某个任意值。 (我知道这很旧,我只是想澄清 为什么 投射不起作用。)

标签: c# key


【解决方案1】:

试试

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);

【讨论】:

  • 按下 F1-F12 时我不需要做任何事情。我需要检查我是否按下了字母、数字或特殊符号
【解决方案2】:

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

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

【讨论】:

  • 特殊符号+ = - / \ ? 和 e.t.c 怎么样
  • @Zlobaton:你的意思是Keys.AddKeys.SubtractKeys.Divide等?
  • 然后,所有使用非拉丁语键盘(例如俄语、希腊语、印地语……)的软件用户都会体验到完全损坏的软件。 char.IsLetterOrDigit 等人的存在是有原因的。 — 使用它们。
  • 我的意思是你可以输入的所有符号。
  • @Timwi:我强调的一点是KeyCode 存在(而不是从演员表开始)。你是绝对正确的,它不会是普遍的。
【解决方案3】:
if (keyData >= Keys.F1 && keyData <= Keys.F12)
{
     //one of the key between F1~F12 is pressed
}

【讨论】:

  • 按下 F1-F12 时我不需要做任何事情。我需要检查我是否按下了字母、数字或特殊符号
  • @Zlobaton:定义特殊符号
【解决方案4】:

您需要一个巨大的 switch/case 语句或检查范围。您可能会发现检查要排除的键更容易,具体取决于较少的键。查看所有可能的值。 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】:

    改写表单的OnKeyPress 方法。 KeyPressEventArgs 提供了一个KeyChar 属性,允许您使用char 上的静态方法。

    正如 Cody Gray 在 cmets 中提到的,此方法仅在具有字符信息的击键上触发。其他按键如 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
      }
    }
    

    【讨论】:

    • 请注意,这发生在比ProcessCmdKey 更高的级别上,并且由于各种原因可能会丢失某些按键。如果它适用于您的目的,那就太好了。但重要的是要意识到它可能不会——它不是具有同等功能和目的的直接替代品。
    • 绝对不是,OnKeyPress 只提供KeyChar 而没有别的,这就是为什么它非常适合这种特定情况。其他按键请在OnKeyDown处理。
    • .. 或OnKeyUp 就此而言。我已经用更多信息更新了答案。
    【解决方案6】:

    我尝试了以下代码,但由于某种原因 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))
    

    【讨论】:

      猜你喜欢
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 2015-11-04
      • 2010-12-20
      • 2016-08-24
      相关资源
      最近更新 更多