Обнаружение нажатий клавиш с использованием 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

Другие вопросы по тегам