4

ASCII テーブルに基づいてキーボード キーの数値を取得する必要があります。WPF にはソリューションが組み込まれていないため、いくつかのハックを試しました。

1.これは大文字の値のみを示します。

        char res ;
        Char.TryParse(e.Key.ToString(),out res);
        Debug.WriteLine((int)res);

2これは、可能な解決策として多くの場所にリストされていますが、完全に間違った番号を示しています。

        Debug.WriteLine(Convert.ToInt16(e.Key).ToString());
      

では、WPF の入力から大文字と小文字の両方の ASCII コードを取得するにはどうすればよいでしょうか。

アップデート

ここでいくつかの回答を得た後、質問を強調したいと思います。入力から大文字と小文字の両方のASCIIコードを絶対に取得する必要があります。ハードコードされた文字比較などはありません。より一般的な方法を探しています。

4

4 に答える 4

5

KeyEventUtility.GetCharFromKey( e.Key ) を見てください。

更新:申し訳ありませんが、それは私のライブラリコードでした

    public static class KeyEventUtility
{
    // ReSharper disable InconsistentNaming
    public enum MapType : uint
    {
        MAPVK_VK_TO_VSC = 0x0,
        MAPVK_VSC_TO_VK = 0x1,
        MAPVK_VK_TO_CHAR = 0x2,
        MAPVK_VSC_TO_VK_EX = 0x3,
    }
    // ReSharper restore InconsistentNaming

    [DllImport( "user32.dll" )]
    public static extern int ToUnicode(
        uint wVirtKey,
        uint wScanCode,
        byte[] lpKeyState,
        [Out, MarshalAs( UnmanagedType.LPWStr, SizeParamIndex = 4 )] 
       StringBuilder pwszBuff,
    int cchBuff,
    uint wFlags );

[DllImport( "user32.dll" )]
public static extern bool GetKeyboardState( byte[] lpKeyState );

[DllImport( "user32.dll" )]
public static extern uint MapVirtualKey( uint uCode, MapType uMapType );

public static char GetCharFromKey( Key key )
    {
        char ch = ' ';

        int virtualKey = KeyInterop.VirtualKeyFromKey( key );
        var keyboardState = new byte[256];
        GetKeyboardState( keyboardState );

        uint scanCode = MapVirtualKey( (uint)virtualKey, MapType.MAPVK_VK_TO_VSC );
        var stringBuilder = new StringBuilder( 2 );

        int result = ToUnicode( (uint)virtualKey, scanCode, keyboardState, stringBuilder, stringBuilder.Capacity, 0 );
        switch ( result )
        {
        case -1:
            break;
        case 0:
            break;
        case 1:
            {
                ch = stringBuilder[0];
                break;
            }
        default:
            {
                ch = stringBuilder[0];
                break;
            }
        }
        return ch;
    }
于 2013-02-11T22:04:09.760 に答える
4

ここに記載されている回答の1つに基づいて、イベントを使用してTextInput(またはPreviewTextInput)イベントを使用して手紙を押すことをお勧めします。大文字と小文字の両方に正しい値が表示されるはずです。

それをテストするために、あなたはこれに似たコードを使うことができます:

private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    Console.WriteLine(String.Format("letter: {0} (charcode: {1})", e.TextComposition.Text, (int)Convert.ToChar(e.TextComposition.Text)));
}

これが役立つかどうか、またはこのソリューションを使用するときに問題が発生した場合はお知らせください。

于 2013-02-11T21:10:18.947 に答える
4

これは、キーボードが機能する方法ではありません。世界中のすべての PC には同じキーボードがあります。キーを押すと、世界中のすべてのキーボードで同じ値である仮想キー値が生成されます。KeyDown イベントで取得する e.Key 値。

これは、ファンクション キー、カーソル キー、Shift キーなどのキーが停止する場所です。キーが文字を生成するタイピング キーでない限り。文字 A のように。内部的に、KeyDown イベントは Windows によって処理され、文字に変換されます。生成される実際の文字は、キーボード レイアウトによって異なります。さまざまな国のユーザーはさまざまなキーボード レイアウトを使用しており、その言語で最も頻繁に使用されるグリフが優先されます。または、ユーザーの個人的な好みについて言えば、プログラマーはしばしば Dvorak レイアウトを好みます。

生成される文字は、キーボードの状態にも依存します。Shift キーと同様に、押したままにすると a が生成されますが、押したままにすると a は生成されません。これは、英語以外のキーボードではかなり複雑になる可能性があり、他のレイアウトにはデッド キーもあり、これを押すと、次のキーストロークによって生成される文字が変更されます。分音記号が多い言語は、それらを使用します。

その意味は明らかです。KeyDown イベントから取得した仮想キーを変換することは、非常に危険な作業です。したがって、これを実行しようとしないでください。TextInput イベントを使用する必要はありません。

于 2013-02-12T01:29:13.867 に答える
0
if (e.Key == Key.A )

このページを見てみましょう

于 2013-02-11T19:01:17.540 に答える