Почему коды клавиш отображаются по-разному на Windows и Linux? - PullRequest
1 голос
/ 06 марта 2020

Я пишу программу на Python, используя библиотеку Pynput. Эта библиотека может прослушивать ключи, используя коды клавиш, такие как эти . В Windows это работало нормально, и коды клавиш те же, что и в приведенной выше ссылке, но в Linux некоторые клавиши выключены на 32, а другие выключены на 16.

Для пример! Клавиша отображается как 049, когда я запускаю свою программу в Windows, но как 033, когда я запускаю ее в Linux (разница 16). Клавиша r в Windows отображается как 82, а в Linux - как 114. Наконец, цифровые клавиши 0–9 отображаются как коды клавиш 096–105 в Windows, но в Linux их коды клавиш отображаются как «None», за исключением цифровой клавиатуры 5, которая отображается как 65437. Этот последний пример особенно странен для меня ,

Результатом этого является то, что моя программа отлично работает в Windows, и ввод! Reload интерпретируется так, как он печатается, но в Linux она интерпретируется как! R5lo14. Самым запутанным моментом является то, что только некоторые ключи интерпретируются правильно, а некоторые нет. Буквы сброшены на 32, но r, l и o верны, e, a и d не верны. ! ключ также корректен, несмотря на то, что он выключен 16 вместо 32. Все клавиши с цифровыми клавишами интерпретируются правильно, кроме цифровой клавиатуры 5.

Вот как я получил значение ключа из моей программы:

# Starts Pynput listener. When you press a key, it calls word_builder with the argument key
with Listener(on_press=self_word_builder) as self._listener:
    self._listener.join()

# Builds a word as you type
def word_builder(self, key):

    self._key = key

    # Assigns self._keycode with the string value of key
    self._keycode_to_keydata()

    # MAP VK KEYS HERE. Below codeblock shows this in more detail

    # Output resulting key
    print(self._keycode)

Я просто хотел заметить, что это не проблема с Pynput, поскольку он не распознавал клавиши numpad даже на Windows. Мы исправили это, переназначив ключи pynput, читаемые как vk, например vk_numpad1. Это когда он больше не работает правильно на Linux. Это переназначение приведено ниже:

    # Map virtual key codes for key codes outside the typical ASCII keyboard range
    self._vk_map = {
        110: '.',  # [Num .]
    }
    # Numpad support
    self._vk_map.update({i: f'{i - 96}' for i in range(96, 106)})  # [Num 0] = 96, [Num 1] = 97

    if hasattr(self._key, 'vk'):
        # Map the vk values
        if self._key.vk in self._vk_map:
            key = self._vk_map[self._key.vk]

До нашего исправления все правильно работало на Windows и Linux, за исключением клавиш с цифровой клавиатурой, поэтому почти 10 * * показывает, что некоторые клавиши отображаются как виртуальные ключи, а не другие, но я не уверен, как это подтвердить.

В своих попытках это исправить я попытался найти Linux эквивалент кодов клавиш Windows, которые я разместил выше, но Я не мог ничего найти. Самым близким, что я нашел, было приложение на моей машине под названием Character Map, которое находило эти ключи в отдельных списках. Например, когда я искал мой нижний регистр e, он ошибся (101), но верхний регистр E был правильным (069). Каждый из них появился в другом списке символов, который был назван по-разному. ! появился в третьем списке персонажей. Есть ли у Linux список кодов клавиш по умолчанию, или он отличается на каждом Linux компьютере?

Я также пытался исправить это программно, но я не могу найти других людей, перечисляющих эту проблему, где бы я ни смотрел. Я не очень понимаю, что происходит, поэтому мне очень трудно даже попытаться исправить ситуацию. Я только нашел причину (коды символов появляются неправильно в Linux), но так как они не расходятся с эквивалентом Windows с той же суммой, я не могу просто исправить это смещение. С этим постом я надеялся получить представление о том, что происходит, и любые предложения о том, как лучше всего решить эту проблему. Заранее спасибо за любые предложения.

...