我覆盖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时,它会将它们转换为字母。
也许有人知道更好的方法来解决这个问题?
答案 0 :(得分:14)
改为覆盖表单的OnKeyPress
方法。 KeyPressEventArgs
提供KeyChar
属性,允许您使用char
上的静态方法。
正如Cody Gray在评论中所提到的,此方法仅触发具有角色信息的击键。 F1-F12等其他击键应在OnKeyDown
或OnKeyUp
处理,具体视您的情况而定。
来自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))