Обнаружение нажатий клавиш с использованием win32api в Python
Я пытаюсь разорвать цикл в Python с определенным нажатием клавиши, используя win32api. Как можно поступить об этом?
Какова действительная версия win32api.KeyPress('H') в следующем коде?
Последоработки:
import win32api
while True :
cp = win32api.GetCursorPos()
print cp
if win32api.KeyPress('H') == True :
break
Я хочу иметь возможность разорвать цикл, нажав клавишу h.
Редактировать:
Я пытаюсь создать программу, которая постоянно сообщает о положении мыши, и мне нужен механизм для выхода из указанной программы.
Смотрите пересмотренный код.
3 ответа
win32api
это просто интерфейс к низкоуровневой библиотеке нижележащих окон. Увидеть GetAsyncKeyState
Функция:
Определяет, находится ли клавиша вверх или вниз во время вызова функции, и была ли клавиша нажата после предыдущего вызова GetAsyncKeyState.
Синтаксис
SHORT WINAPI GetAsyncKeyState(
__in int vKey
);
Возвращаемое значение
Тип:
SHORT
Если функция завершается успешно, возвращаемое значение указывает, была ли клавиша нажата с момента последнего вызова GetAsyncKeyState, и указана ли клавиша в данный момент вверх или вниз. Если задан старший значащий бит, клавиша нажата, а если задан младший значащий бит, клавиша была нажата после предыдущего вызова GetAsyncKeyState.
Обратите внимание, что возвращаемое значение кодируется в битах (не boolean
). Чтобы получить в vKey
значения, приложение может использовать константы кода виртуальной клавиши в win32con
модуль.
Например, тестирование клавиши "CAPS LOCK":
>>> import win32api
>>> import win32con
>>> win32con.VK_CAPITAL
20
>>> win32api.GetAsyncKeyState(win32con.VK_CAPITAL)
0
>>> win32api.GetAsyncKeyState(win32con.VK_CAPITAL)
1
Константа виртуальной клавиши для простых букв - это коды ASCII, поэтому проверка состояния клавиши "H" (нажатие клавиши) будет выглядеть следующим образом:
>>> win32api.GetAsyncKeyState(ord('H'))
1
Это не так, как это работает в программировании GUI. Вы не вызываете метод для проверки нажатия клавиши. Вместо этого вы получаете отправленные сообщения при нажатии клавиш. Предполагая, что у вас есть окно, которое получает ввод, вам нужно ответить на WM_KEYDOWN
сообщение, прибывающее в вашу оконную процедуру, или карта сообщений в терминах Python win32api.
Ваше редактирование показывает, что вы не используете очередь сообщений, что довольно необычно. Вы можете достичь желаемого, позвонив GetAsyncKeyState()
,
Посмотрите тайлер Python на github, очень полезно, даже если вы пытаетесь просто найти коды клавиш для отправки. Также это будет полезно, если вы выполняете свой код в фоновом режиме и хотите разорвать цикл снаружи окна.
проект git: https://github.com/Tzbob/python-windows-tiler
код с ключами Windows: https://code.google.com/p/python-windows-tiler/source/browse/pwt/hotkey.py?r=df41af2a42b6304047a5f6f1f2903b601b22eb39