31

仮想キーコードを文字にマップしようとしています。

私のコードは ProcessCmdKey を使用して WM_KEYDOWN をリッスンし、押されたキーにアクセスできるようにします。たとえば、一重引用符を押すと、222 のキーが得られます。これを keychar 39 にマップする必要があります。

私の開発コンテキストは次のとおりです。 - .net Framework 2.0 - 多くの場所に配置された UserControl

質問の答えを知っていますか?

4

7 に答える 7

45

それがSystem.Windows.Form.KeysConverterクラスの目的ではないでしょうか。

KeysConverter kc = new KeysConverter();
string keyChar = kc.ConvertToString(keyData);
于 2008-11-26T14:40:30.010 に答える
28

はい、そのMapVirtualKey方法を使用しました。しかし、私はそれを使用する方法の詳細を期待していました: 使用するDllImportディレクティブ、enum文字へのマッピングに固有のものなど.

5 秒ほどググってから解決策を提案するような回答は好きではありません。本当の課題は、すべての要素をまとめて、大量のサンプルのない MSDN ページやその他のコーディング フォーラムで時間を無駄にする必要がないことです。あなたの答えを得るために。不快な台座はありませんが、フォーラムに質問を投稿する前からこの回答を持っていたので、あなたの回答 (たとえ良いものでも) は無意味でした!

それでは、私が探していたもの、つまりすぐに使える C# ソリューションを投稿します。

1- このディレクティブをクラス内に配置します。

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

2- 次のように char を取得します。

  protected override bool ProcessCmdKey(ref Message msg, Keys keyData)      
  {
     const int WM_KEYDOWN = 0x100;

     if (msg.Msg == WM_KEYDOWN)
     {            
        // 2 is used to translate into an unshifted character value 
        int nonVirtualKey = MapVirtualKey((uint)keyData, 2);

        char mappedChar = Convert.ToChar(nonVirtualKey);
     }

     return base.ProcessCmdKey(ref msg, keyData);
  }

気遣ってくれてありがとう...そして楽しんでください!

于 2008-11-26T14:29:30.750 に答える
22

似たようなものを探していましたが、現在のキーボード レイアウトにマップされた文字が必要でした。上記の回答はどれも私の要件を満たしていないため、ここに私が思いついたものがあります。


        public string KeyCodeToUnicode(Keys key)
        {
            byte[] keyboardState = new byte[255];
            bool keyboardStateStatus = GetKeyboardState(keyboardState);

            if (!keyboardStateStatus)
            {
                return "";
            }

            uint virtualKeyCode = (uint)key;
            uint scanCode = MapVirtualKey(virtualKeyCode, 0);
            IntPtr inputLocaleIdentifier = GetKeyboardLayout(0);

            StringBuilder result = new StringBuilder();
            ToUnicodeEx(virtualKeyCode, scanCode, keyboardState, result, (int)5, (uint)0, inputLocaleIdentifier);

            return result.ToString();
        }

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

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

        [DllImport("user32.dll")]
        static extern IntPtr GetKeyboardLayout(uint idThread);

        [DllImport("user32.dll")]
        static extern int ToUnicodeEx(uint wVirtKey, uint wScanCode, byte[] lpKeyState, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff, int cchBuff, uint wFlags, IntPtr dwhkl);

于 2016-08-05T10:44:27.270 に答える
1

KeysConverterは、キー「text」ではなくキー名を取得します。例:「2」ではなく「Num2」MapVirtualKeyは英語では機能しますが、MapVirtualKeyExを使用する英語以外の文字のドキュメント状態では機能しますが、ロケール識別子が必要です。カルチャID定数ですが、正しいID値を見つけた後、試したときに機能しなかったため、最終的にすべてをダンプしました

于 2009-10-24T12:25:31.930 に答える