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

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

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

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

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

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

6 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

http://www.larsen-b.com/Article/184.html

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