我在其中一个控件上处理按键事件。如果按下的键是实际输入(字母,数字或某种符号),我想将它附加到我拥有的字符串。如果它是一个控制角色(输入,逃脱等),我不想做任何事情。
是否有快速简便的方法来确定密钥代码是可打印字符还是控制字符?
目前我在做
if (e.KeyCode == Keys.Enter)
{
e.Handled = false;
return;
}
但我知道可能还有一些我不关心的键在系统处理程序中做了一些重要的事情,所以我不想处理它们。
答案 0 :(得分:11)
如果您只想要可打印的字符,那么您可能不希望OnKeyDown
。您应该使用OnKeyPress
来代替仅用于可打印字符(或多或少),并应用修饰键的翻译(主要是Shift)。
我上面说“或多或少”,因为你也会得到控制字符,这些字符不一定是 printable 。不过,可以使用char.IsControl
轻松过滤掉这些内容。
protected override void OnKeyPress(KeyPressEventArgs e){
if(!char.IsControl(e.KeyChar)){
// do something with printable character
}
}
在这样的设计中容易忽略的是退格键。通常,收到退格字符('\b'
或(char)8
)后的最佳行为是从缓冲区中删除最后一个字符。很容易忘记这样做。
答案 1 :(得分:6)
如果您处理KeyPress
事件而不是KeyDown
,则KeyPressEventArgs
将拥有KeyChar属性。这将减少您获得的“额外”关键事件的数量。然后,您可以使用char.IsLetterOrDigit
或char.IsControl之类的内容来过滤您想要的内容。
答案 2 :(得分:3)
假设您只有KeyCode
,则可以尝试P / Invoking MapVirtualKey函数。我不确定这是否适用于所有文化。
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int MapVirtualKey(int uCode, int uMapType);
public static bool RepresentsPrintableChar(this Keys key)
{
return !char.IsControl((char)MapVirtualKey((int)key, 2));
}
Console.WriteLine(Keys.Shift.RepresentsPrintableChar());
Console.WriteLine(Keys.Enter.RepresentsPrintableChar());
Console.WriteLine(Keys.Divide.RepresentsPrintableChar());
Console.WriteLine(Keys.A.RepresentsPrintableChar());
输出:
false
false
true
true
答案 3 :(得分:-1)
检查此功能,您可能希望将char
转换为byte
(或只是编辑该功能):
bool IsPrintable(byte item)
{
// Range of chars from space till ~ (tilda)
return item >= 32 && item < 126;
}