如何确定KeyCode是否为可打印字符

cap*_*aig 9 c# keyboard winforms

我在我的一个控件上处理按键事件.如果按下的键是实际输入(字母,数字或某种符号),我想将它附加到我拥有的字符串.如果它是一个控制角色(输入,逃脱等),我不想做任何事情.

是否有一种快速简便的方法来确定密钥代码是可打印字符还是控制字符?

目前我在做

if (e.KeyCode == Keys.Enter)
      {
        e.Handled = false;
        return;
      }
Run Code Online (Sandbox Code Playgroud)

但我知道可能还有一些我不关心的键在系统处理程序中做了一些重要的事情,所以我不想处理它们.

P D*_*ddy 11

如果你只想要可打印的字符,那么你可能不想要OnKeyDown.你应该使用OnKeyPress它,它只用于可打印字符(或多或少),并应用修饰键的翻译(主要是Shift).

我上面说"或多或少",因为你也会得到控制字符,这些字符不一定是可打印的.但是,这些可以很容易地过滤掉char.IsControl.

protected override void OnKeyPress(KeyPressEventArgs e){
    if(!char.IsControl(e.KeyChar)){
        // do something with printable character
    }
}
Run Code Online (Sandbox Code Playgroud)

在这样的设计中容易忽略的是退格键.通常,收到退格符('\b'(char)8)后的最佳行为是从缓冲区中删除最后一个字符.很容易忘记这样做.


Bob*_*Bob 6

如果您处理KeyPress事件而不是KeyDown,KeyPressEventArgs则将具有KeyChar属性.这将减少您获得的"额外"关键事件的数量.然后,您可以使用类似char.IsLetterOrDigitchar.IsControl过滤你想要什么.


Ani*_*Ani 5

假设您只有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));
}
Run Code Online (Sandbox Code Playgroud)
Console.WriteLine(Keys.Shift.RepresentsPrintableChar());
Console.WriteLine(Keys.Enter.RepresentsPrintableChar());
Console.WriteLine(Keys.Divide.RepresentsPrintableChar());
Console.WriteLine(Keys.A.RepresentsPrintableChar());
Run Code Online (Sandbox Code Playgroud)

输出:

false
false
true
true
Run Code Online (Sandbox Code Playgroud)