Как вы получаете символ, подходящий для данного события KeyDown? - PullRequest
2 голосов
/ 27 января 2011

Как вы получаете символ, подходящий для данного события KeyDown в WPF?

Ответы [ 4 ]

3 голосов
/ 19 апреля 2012
 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,
    }
    [DllImport("user32.dll")]
    public static extern bool GetKeyboardState(byte[] lpKeyState);
    [DllImport("user32.dll")]
    public static extern uint MapVirtualKey(uint uCode, MapType uMapType);
    [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);

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

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

        uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC);
        StringBuilder 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;
    }
2 голосов
/ 27 января 2011

Попробуйте это:

var virtualKey = (uint)KeyInterop.VirtualKeyFromKey(e.Key);
var keyCode = MapVirtualKey(virtualKey, 0);

Функция импорта MapVirtualKey

[DllImport("user32.dll")]
static extern uint MapVirtualKey(uint uCode, uint uMapType);
0 голосов
/ 28 августа 2012
private void UserControl1_KeyDown_1(object sender, KeyEventArgs e)
{   
    FieldInfo field = e.GetType().GetField
    (
       "_scanCode",
       BindingFlags.NonPublic |
       BindingFlags.Instance
    );

    Int32 scancode = (Int32)field.GetValue(e);

    char c = (char)scancode;
}
0 голосов
/ 27 января 2011

Не все события KeyDown соответствуют одному видимому символу - например, Backspace и Enter.Вам нужно будет сравнить содержимое аргумента события с тем, что вы хотите связать.Например, на моей клавиатуре US QUERTY клавиша в верхнем левом углу является обратным тиканем, но для другой клавиатуры она может выглядеть как-то иначе.

...