Я хочу, чтобы иметь возможность использовать пакет msvcrt
в python, чтобы поймать нажатия клавиш с помощью метода msvcrt.getch()
, но, похоже, окно терминала должно быть в фокусе для него работать. Есть ли способ обойти это?Улавливание нажатия клавиш на Windows с помощью Python с использованием MSVCRT, когда окно терминала не находится в фокусе
ответ
Я нашел оболочку python для Ctypes, предложенную @IInpectable. Он обматывает крючки с клавиатурой low_level с хорошим классом монитора.
Вы прочитали примечание к документации [https://msdn.microsoft.com/en-us/library/windows/desktop/ms644985.aspx] документации? Здесь это: * «[...] В большинстве случаев, когда приложение должно использовать крючки низкого уровня, ** он должен контролировать исходный ввод вместо **. Это потому, что сырой ввод может асинхронно отслеживать сообщения мыши и клавиатуры, которые нацелены для других потоков более эффективно, чем крючки низкого уровня. Дополнительную информацию о необработанном вводе см. в разделе [Сырой вход] (https://msdn.microsoft.com/en-us/library/ms645536 (vs.85) .aspx). "* – IInspectable
Я подсвечиваю светодиод здесь. Не точно вычисляет ответ на вселенную. Моя реализация кажется достаточно быстрой. –
Рекомендация не относится только к вашему приложению. Низкоуровневые клавиатурные крючки влияют на производительность всей системы. Для каждого ввода с клавиатуры вы получаете два дополнительных переключателя контекста, а также время, необходимое для обработки вашего события. И поскольку Stack Overflow - это сайт Q & A, кто-то может найти ваш вопрос, и они ** ** вычисляют ответ на вселенную. – IInspectable
Поскольку вход только когда-либо выходит на передний план окно, процесс вызова 'getch', очевидно, должен быть на переднем плане процесс. Вы не можете изменять правила. Однако вы не спрашивали о реальной проблеме, которую пытаетесь решить. Что это? – IInspectable
Ну, у меня есть Python, отправляющий сообщения на мой arduino, управляющий светодиодной полосой, когда я нажимаю клавиши на клавиатуре, поэтому я хочу иметь возможность обнаруживать нажатия клавиш, даже когда окно терминала не находится в фокусе. Есть ли способ сделать окно постоянным в фоновом режиме? –
* «Есть ли способ сделать окно стойким в фоновом режиме?» * - Uhm ... нет, но даже если бы это было, это не принесло бы окно на передний план (что вам нужно для 'getch() 'делать что-либо значимое). Если вы хотите контролировать вход без процесса переднего плана, вам понадобится что-то вроде [Raw Input] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536.aspx) или установите [низкоуровневый клавиатурный крючок] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644985.aspx). – IInspectable