Ищите функцию преобразования VirtualKey в реальные символы - PullRequest
0 голосов
/ 05 декабря 2018

Я ищу функцию, которая получает кучу VirtualKeys в RawInput с клавиатуры.Программное обеспечение, очень похожее на кейлоггер в C #.На всякий случай я искал чертовски много и ничего не мог найти.

Context

  • Для захвата события я использую KeyPressed.
  • Чтобы прочитать значение VKey y, обращайтесь к нему из e.KeyPressEvent.VKeyName.
  • Для буквенных символов отлично работает, 'A'->'A', 'B'->'B' and so on.
  • Остальные символы не будут, случаи:
    • символ комбинации клавиш (что означает, что для их создания нужно нажать более одной клавиши), например '@'->'AltGr + 2' or '$'->'Shift+5'.
    • Простое число.Всякий раз, когда я нажимаю любое число: '2' -> 'D2'.
    • Специальный символ, который при нажатии ' ' -> SPACE.

Что мне нужно

Всякий раз, когда я нажимаю кнопку, я хочу получить ее точное значение, а не просто "ПРОБЕЛ" или "OEMSEMICOLON".Мне нужно получить один символ со значением 'или'; 'или что я нажимаю.

Простой код

private void OnKeyPressed(object sender, RawInputEventArg e)
{
    KeysConverter kc = new KeysConverter();
    string keyChar = kc.ConvertToString(e.KeyPressEvent.VKeyName);
    Console.WriteLine("You pressed: " + e.KeyPressEvent.VKeyName);
}

Образец с консоли

Values I get from keyboard vs values I need in ''

1 Ответ

0 голосов
/ 05 декабря 2018

такой функции со всеми вашими особенностями не существует.Вы должны построить таблицу соответствия.

простой способ - создать первый массив или таблицу enum с 256 виртуальными кодами клавиш или кодами сканирования, а второй массив дает вам правильный перевод virtualKey или кода сканирования в строковый ключ

например

public enum Key
{
        Escape = 1,
        D1,
        D2,
        D3,
        D4,
        D5,
        D6,
        D7,
        D8,
        D9,
        D0
}


private string[] stringCodeMap = {
            "",   //key = 0,
            "",   //key = 1,
            "1",  //D1 = 2,
            "2",  //D2 = 3,
            "3",  //D3 = 4,
            "4",  //D4 = 5,
            "5",  //D5 = 6,
            "6",  //D6 = 7,
            "7",  //D7 = 8,
            "8",  //D8 = 9,
            "9",  //D9 = 10,
            "0",  //D0 = 11
}

и вы можете перехватить строковый код с помощью: если scankey является результатом нажатия клавиши (виртуальная клавиша или клавиша сканкода)

string skey = stringCodeMap[(int)scankey];

для нескольких нажатых клавиш, Управление, сдвиг (влево или вправо) .... имеют свой код

...