我不知道有任何库是为了扩展而设计的。然而,正如您的链接所述,pykeylogger 的后端给出了如何执行此操作的示例,但对于您的需要来说,它似乎有点过于复杂。
pykeylogger 使用 python-xlib 模块捕获 X 显示屏上的按键。有人已经创建了一个更简单的示例来说明如何完成此操作pastebin。以下是按原样复制到此处的源代码。
from Xlib.display import Display
from Xlib import X
from Xlib.ext import record
from Xlib.protocol import rq
disp = None
def handler(reply):
""" This function is called when a xlib event is fired """
data = reply.data
while len(data):
event, data = rq.EventField(None).parse_binary_value(data, disp.display, None, None)
# KEYCODE IS FOUND USERING event.detail
print(event.detail)
if event.type == X.KeyPress:
# BUTTON PRESSED
print("pressed")
elif event.type == X.KeyRelease:
# BUTTON RELEASED
print("released")
# get current display
disp = Display()
root = disp.screen().root
# Monitor keypress and button press
ctx = disp.record_create_context(
0,
[record.AllClients],
[{
'core_requests': (0, 0),
'core_replies': (0, 0),
'ext_requests': (0, 0, 0, 0),
'ext_replies': (0, 0, 0, 0),
'delivered_events': (0, 0),
'device_events': (X.KeyReleaseMask, X.ButtonReleaseMask),
'errors': (0, 0),
'client_started': False,
'client_died': False,
}])
disp.record_enable_context(ctx, handler)
disp.record_free_context(ctx)
while 1:
# Infinite wait, doesn't do anything as no events are grabbed
event = root.display.next_event()
您将必须扩展处理程序以满足您的需求,而不仅仅是打印到屏幕,然后将其放入单独的线程中。
(痛苦的)替代方案是直接听键盘,而不依赖外部库或 X 会话。在Linux中,一切都是文件,你的键盘输入将位于 /dev/input 中例如,您可以将其作为文件读取open('/dev/input/even2', 'rb')
,在后台。不建议这样做,因为它需要升级权限,找出哪个设备是键盘,然后创建您自己的键盘映射。只是想让您知道如果有必要的话可以做什么。
编辑:还发现使用 Python gtk3 在 X 上进行全局键绑定这似乎有更多的例子。