代码之家  ›  专栏  ›  技术社区  ›  captncraig

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

  •  9
  • captncraig  · 技术社区  · 14 年前

    我正在处理一个控件上的按键关闭事件。如果按下的键是实际输入(字母、数字或某种符号),我想将它附加到我拥有的字符串中。如果它是控制字符(回车、转义等),我不想做任何事情。

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

    目前我正在做

    if (e.KeyCode == Keys.Enter)
          {
            e.Handled = false;
            return;
          }
    

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

    4 回复  |  直到 7 年前
        1
  •  11
  •   P Daddy    14 年前

    如果你只想要可打印的字符,那么你可能不想要 OnKeyDown . 你应该用 OnKeyPress 相反,它被称为 只有 对于可打印字符(或多或少),并应用修改键的翻译(主要是shift)。

    我在上面说了“或多或少”,因为你也会得到控制字符,这不一定 可印刷的 . 这些很容易被过滤掉 char.IsControl 但是。

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

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

        2
  •  6
  •   Bob    14 年前

    如果你处理 KeyPress 事件而不是 KeyDown , the KeyPressEventArgs 将有一个 KeyChar 财产。这将减少您获得的“额外”关键事件的数量。然后你可以用类似的东西 char.IsLetterOrDigit char.IsControl 过滤你想要的。

        3
  •  3
  •   Ani    14 年前

    假设你只有 KeyCode ,您可以尝试p/调用 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
    
        4
  •  -1
  •   graphemecluster    7 年前

    检查此函数,您可能需要强制转换 char byte (或简单地编辑函数):

    bool IsPrintable(byte item)
    {
        // Range of chars from space till ~ (tilda)
        return item >= 32 && item < 126;
    }