Сам вопрос не имеет ничего общего с 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.