簡體   English   中英

如何確定KeyCode是否為可打印字符

[英]How to determine if KeyCode is printable character

我在我的一個控件上處理按鍵事件。 如果按下的鍵是實際輸入(字母,數字或某種符號),我想將它附加到我擁有的字符串。 如果它是一個控制角色(輸入,逃脫等),我不想做任何事情。

是否有一種快速簡便的方法來確定密鑰代碼是可打印字符還是控制字符?

目前我在做

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

但我知道可能還有一些我不關心的鍵在系統處理程序中做了一些重要的事情,所以我不想處理它們。

如果你只想要可打印的字符,那么你可能不想要OnKeyDown 您應該使用OnKeyPress ,它針對可打印字符(或多或少)調用,並應用修飾鍵的翻譯(主要是Shift)。

我上面說“或多或少”,因為你也會得到控制字符,這些字符不一定是可打印的 但是,可以使用char.IsControl輕松過濾掉這些內容。

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

在這樣的設計中容易忽略的是退格鍵。 通常,收到退格字符( '\\b'(char)8 )時的最佳行為是從緩沖區中刪除最后一個字符。 很容易忘記這樣做。

如果您處理KeyPress事件而不是KeyDown ,則KeyPressEventArgs將具有KeyChar屬性。 這將減少您獲得的“額外”關鍵事件的數量。 然后,您可以使用char.IsLetterOrDigitchar.IsControl之類的東西來過濾您想要的內容。

假設您只有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

檢查此函數,您可能希望將charbyte (或只是編輯函數):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM