ctypes пользовательский ввод для передачи в другую программу - PullRequest
0 голосов
/ 01 июня 2018

Привет, я составил этот код, но, как вы можете видеть в конце, не идеально делать это с каждым ключом:

if (ThatKey == "e"): 
    ThatKey = E_KEY

Есть ли более эффективный способ сделатьэто?

(полный код): https://pastebin.com/ctnYVjxN

1 Ответ

0 голосов
/ 02 июня 2018

Сам вопрос не имеет ничего общего с ctypes (тот факт, что он используется в коде не имеет значения), поэтому я удалил тег.

AFAIK нет сопоставления между Код виртуального ключа и его имя (если хотите).Давайте рассмотрим VK_RETURN. Ввод ключ имеет множество имен:

  • Ввод , Возврат , CR , \n , Возврат каретки , 0x0D , ...
  • Выше приведены только заглавные версии
  • Локализованные версии

Не было бы никакого смысла иметь такое отображение, потому что всегда были бы необходимые изменения.Таким образом, любой, кому нужно сопоставление, должен будет написать его «вручную».

code.py :

import sys


VK_TAB  = 0x09
VK_MENU = 0x12
VK_RETURN = 0x0D
VK_F1 = 0x70
VK_ESCAPE = 0x1B
# Some other VK_* keys

INVALID_VK = 0

SPECIAL_KEYS = {
    "ENTER": VK_RETURN,
    "ESC": VK_ESCAPE
}

def get_virtual_key_code(key_name, module=None, special_keys_mapping=None):
    key_name_upper = key_name.upper()
    if key_name.isalnum() and len(key_name) == 1:
        return ord(key_name_upper)
    vk_code_name = "VK_" + key_name_upper
    if module is None:
        vk_code = globals().get(vk_code_name, INVALID_VK)
    else:
        vk_code = getattr(module, vk_code_name, INVALID_VK)
    if vk_code == INVALID_VK and special_keys_mapping:
        vk_code = special_keys_mapping.get(key_name_upper, INVALID_VK)
    return vk_code


def main():
    vkc = None
    while vkc != VK_ESCAPE:
        key_name = raw_input("What key would you like to press: ")
        vkc = get_virtual_key_code(key_name, special_keys_mapping=SPECIAL_KEYS)
        print("Virtual key code for '{:s}': 0x{:02X}".format(key_name, vkc))
    print("Done.")


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()

Примечания :

  • get_virtual_key_code:
    • key_name: это строковое представление ключа
    • module: модуль, в котором константы VK _ *определены.Сейчас.они находятся в глобальном разделе текущего модуля.Но если вы решите переместить их в отдельный модуль (который я бы порекомендовал сохранить модульным), просто передайте его в качестве аргумента (после импорта, конечно).Кроме того, вы могли бы избавиться от 2 nd if от функции (оставьте только правую ветвь)
    • Если key_name является одним из буквенно-цифровых символов, то его виртуальный кодэто код ASCII (заглавные буквы).Таким образом, нет необходимости определять соответствующие VK _ * константы (или любые другие константы, такие как E_KEY)
    • Затем, имя константы строится на основе имени ключа (например, для f1 , имя константы будет VK_F1)
    • Если константа не найдена, специальное отображение (special_keys_mapping - если предусмотрено)поиск.Это для особых случаев (например, ENTER - VK_RETURN, поскольку нет автоматического способа их связывания)
    • Если константа не найдена, 0 возвращается
    • Каждое сравнение строк не учитывает регистр
  • Код продолжает работать, пока пользователь хочет обработать VK_ESCAPE
  • Он также должен работать в Python3 (при замене raw_input на input)

Вывод :

(py27x64_test) e:\Work\Dev\StackOverflow\q050638652>"e:\Work\Dev\VEnvs\py27x64_test\Scripts\python.exe" code.py
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32

What key would you like to press: 1
Virtual key code for '1': 0x31
What key would you like to press: a
Virtual key code for 'a': 0x41
What key would you like to press: A
Virtual key code for 'A': 0x41
What key would you like to press:
Virtual key code for ' ': 0x00
What key would you like to press: f1
Virtual key code for 'f1': 0x70
What key would you like to press: f2
Virtual key code for 'f2': 0x00
What key would you like to press: return
Virtual key code for 'return': 0x0D
What key would you like to press: Enter
Virtual key code for 'Enter': 0x0D
What key would you like to press: ESC
Virtual key code for 'ESC': 0x1B
Done.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...