Конвертировать String или Char в объект Keys - PullRequest
2 голосов
/ 19 октября 2010

Если я использую следующий код:

for (int i = 0; i < text.Length; i++)
    {
        char c = text[i];
        Keys k = (Keys)(byte)c;
        MessageBox.Show(c.ToString() + "|" + k.ToString());
    }

Я могу получить правильное преобразование только для заглавных букв. Проблема в том, что мне нужно иметь возможность реплицировать символы в нижнем регистре, и я получаю ошибки преобразования на них. Например, «e» преобразуется в «NumPad5», где «E» правильно преобразуется в «E». Как я могу атаковать это? Я собираюсь взять строки ввода и создать виртуальные нажатия клавиш для макро-плеера, который я пытаюсь разработать.

Ответы [ 3 ]

5 голосов
/ 19 октября 2010

Это похоже на неправильный подход. Рассматривали ли вы использовать SendKeys ?

1 голос
/ 22 июня 2017

Ответ - построить таблицу обратного просмотра для нужных вам символов. Код можно было бы оптимизировать и дальше, но это не требует пояснений. Вы можете добавить специальные символы явно при необходимости.

Вы также можете одновременно создать словарь, чтобы пойти другим путем, если вам захочется. Многоключевые символы требуют тривиального расширения, но они все равно не отображаются непосредственно на ключи. Для вашего прочтения и возможного продления, если вам потребуется:

using System.Windows.Forms;
static ImmutableDictionary<char, Keys> CharVKeyLookup;
static void PopulateVKeyCharDictionary(){
    var keyboardStateNormal = new byte[255]; //All keys up
    var keyboardStateShift = new byte[255];
    keyboardStateShift[(int)Keys.ShiftKey] = 0x80;
    var charlookup = new Dictionary<char, Keys>();
    for (var i = 1; i < (int) Keys.OemClear; i++){
        var keys = (Keys) i;
        //Verbose condition to ignore unnecessary conversions - probably a quicker way e.g. statically
        if (keys == Keys.Enter || keys == Keys.Tab || keys == Keys.Space
                || (keys >= Keys.D0 && keys <= Keys.D9)
                || (keys >= Keys.A && keys <= Keys.Z)
                || (keys >= Keys.Multiply && keys <= Keys.Divide)
                || (keys >= Keys.Oem1 && keys <= Keys.Oem102)){
            var normal = KeyCodeToUnicode(keys);
            var shift = KeyCodeToUnicode(keys, true);
            if (normal.Item2 == 1) //Ignore wierdos - extend this if you need it
                charlookup[normal.Item1[0]]=keys;
            if (shift.Item2 ==1)
                charlookup[shift.Item1[0]]=keys|Keys.Shift; //Incl shift mod
        }
    }
    charlookup['\n'] =  Keys.Return;
    charlookup['\r'] = Keys.Return;
    CharVKeyLookup = charlookup.ToImmutableDictionary();
}
/// <returns>string if it exists and return code. -1=dead char, 0=no translation, 1=1 char, 2=special char </returns>
public static Tuple<string, int> KeyCodeToUnicode(Keys key, byte[] keyboardState){
    var scanCode = MapVKToScanCode(key);
    var result = new StringBuilder(10,10);
    var language = InputLanguage.CurrentInputLanguage.Handle;//Or other method such as GetKeyboardLayout
    var returnState = ToUnicodeEx(key, scanCode, keyboardState, result, 10, 0,  language);
    return new Tuple<string, int>(result.ToString(),returnState);
}
[DllImport("user32.dll")]
internal static extern int ToUnicodeEx(Keys wVirtKey, uint wScanCode, byte[] lpKeyState, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff, int cchBuff, uint wFlags, IntPtr dwhkl);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr GetKeyboardLayout(int dwLayout);
1 голос
/ 19 октября 2010

Перечисление Keys не является прямой копией символьных значений символа, сгенерированного при нажатии клавиши.Иногда это так, но иногда это не так.Способ кодирования значения для каждого нажатия клавиш описан в документации :

. Этот класс содержит константы, используемые для обработки ввода с клавиатуры.Ключи идентифицируются значениями ключей, которые состоят из кода ключа и набора модификаторов, объединенных в одно целочисленное значение.Четыре левые цифры значения ключа содержат код ключа (который совпадает с кодом виртуальной клавиши Windows).Четыре правильные цифры значения ключа содержат биты модификатора для клавиш SHIFT, CONTROL и ALT.

...