Существует ли кроссплатформенный низкоуровневый API Python для захвата или генерации событий клавиатуры? - PullRequest
11 голосов
/ 24 марта 2009

Я пытаюсь написать кроссплатформенную программу на Python, которая будет работать в фоновом режиме, отслеживать все события клавиатуры и, когда она обнаруживает определенные комбинации клавиш, генерирует одно или несколько собственных событий клавиатуры. Например, это может быть удобно, когда Ctrl- @ сопоставляется с «my.email@address», поэтому каждый раз, когда какая-то программа запрашивает мой адрес электронной почты, мне просто нужно набрать Ctrl - @.

Я знаю, что такие программы уже существуют, и я заново изобретаю колесо ... но моя цель - просто узнать больше о низкоуровневых API-интерфейсах клавиатуры. Более того, ответ на этот вопрос может быть полезен другим программистам, например, если они хотят запустить соединение SSH, для которого требуется пароль, без использования pexpect.

Спасибо за вашу помощь.

Примечание: есть аналогичный вопрос , но он ограничен платформой Windows и не требует python. Я ищу кроссплатформенный Python API. Есть и другие вопросы, связанные с событиями клавиатуры, но, видимо, они не заинтересованы в общесистемных событиях клавиатуры, а просто в горячих клавишах приложений.

Редактировать: Я, вероятно, должен добавить здесь отказ от ответственности: я не хочу написать кейлоггер. Если бы мне понадобился кейлоггер, я мог бы в любом случае загрузить его из Интернета. ; -)

Ответы [ 6 ]

8 голосов
/ 24 марта 2009

Нет такого API. Мое решение было написать вспомогательный модуль, который будет использовать другой помощник в зависимости от значения os.name.

В Windows используйте расширения Win32 .

В Linux все немного сложнее, поскольку реальные ОС защищают своих пользователей от клавиатурных шпионов [*]. Итак, здесь вам понадобится корневой процесс, который наблюдает за одним из [] дескрипторов в /dev/input/. Ваша лучшая ставка, вероятно, ищет запись ниже /dev/input/by-path/, которая содержит строки "kbd" или "keyboard". Это должно работать в большинстве случаев.

[*]: Боже, даже мой сканер вирусов / троянов не будет жаловаться, когда я запускаю программу Python, которая подключается к событиям клавиатуры ...

7 голосов
/ 27 июля 2009

Как парень, который написал оригинальный порт Linux Pykeylogger, я могу сказать, что на самом деле нет кроссплатформенного. По сути, я переписал API-интерфейс pyhook для ввода с клавиатуры событий с самого xserver, используя расширение записи. Конечно, это предполагает, что расширение записи уже загружено на сервер x.

С этого момента, по сути, вы просто определяете, используете ли вы windows или linux, и затем загружаете правильный модуль для ОС. Все остальное должно быть идентично.

Взгляните на источник pykeylogger, в pyxhook.py для определения класса и имплиментации. В противном случае просто загрузите этот модуль или pyhook, в зависимости от ОС.

1 голос
/ 03 ноября 2009

Я провел несколько тестов на Ubuntu 9.10. Pykeylogger, кажется, не работает. Я попытался изменить /etc/X11/xorg.conf, чтобы разрешить загрузку модуля, но в этой конкретной версии ubuntu нет xorg.conf. Так что, по моему мнению, pykelogger НЕ работает на Ubuntu 9.10 !!

0 голосов
/ 26 ноября 2009

В Linux это довольно легко сделать с помощью Xlib. Подробности смотрите на этой странице:

http://www.larsen -b.com / Статья / 184.html

0 голосов
/ 25 марта 2009

В Linux вы можете взглянуть на pykeylogger . По какой-то странной причине чтение из / dev / input / .... не всегда работает, когда X работает. Например, это не работает на Ubuntu 8.10. Pykeylogger использует xlib, который работает именно тогда, когда нет другого. Я все еще изучаю это, поэтому, если вы найдете более простой способ сделать это, пожалуйста, скажите мне.

0 голосов
/ 24 марта 2009

Кроссплатформенные библиотеки пользовательского интерфейса, такие как Tkinter или wxPython , имеют API для событий клавиатуры. Используя их, вы можете сопоставить «CTRL» + «@» с действием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...