Python Xlib 捕获/发送鼠标点击

1 投票
1 回答
10430 浏览
提问于 2025-04-15 12:59

目前我正在尝试用Python来检测左键鼠标是否被按住,然后快速发送这个事件,而不是只发送一次。我的基本想法是,当左键被按住时,它会不断点击,直到你松开为止。不过,我对Xlib感到有点困惑,觉得它很复杂。能帮我一下吗?这就是我目前的代码:

#!/usr/bin/env python

import Xlib
import Xlib.display

def main():
    display = Xlib.display.Display()
    root = display.screen().root
    while True:
        event = root.display.next_event()
        print event

if __name__ == "__main__":
    main()

但是可惜的是,控制台没有任何输出。经过快速搜索,我发现了以下内容:

root.change_attributes(event_mask=Xlib.X.KeyPressMask)
root.grab_key(keycode, Xlib.X.AnyModifier, 1, Xlib.X.GrabModeAsync,
              Xlib.X.GrabModeAsync)

看起来捕捉特定事件需要用到给定的键码。那么,左键点击的键码是什么呢?如果有的话?其次,我该如何检测到它被按住,然后开始快速发送鼠标点击事件呢?我会非常感激任何帮助。(也许有个热键可以停止这个脚本也不错……)

1 个回答

5

其实你需要的是 Xlib.X.ButtonPressMask | Xlib.X.ButtonReleaseMask,这样才能获取到按钮按下和松开的事件(这和键盘按下和松开是不同的)。这些事件分别是 ButtonPressButtonRelease,而 detail 这个变量会告诉你哪个按钮被按下了。从你收到按下事件的那一刻起,到收到松开事件的时候,你就知道这个按钮是被按住的。当然,你也可以接收键盘事件,当某个键被按下时做其他事情(比如退出你的脚本)。

编辑: 这个版本对我来说运行得很好,比如...:

import Xlib
import Xlib.display

def main():
    display = Xlib.display.Display(':0')
    root = display.screen().root
    root.change_attributes(event_mask=
        Xlib.X.ButtonPressMask | Xlib.X.ButtonReleaseMask)

    while True:
        event = root.display.next_event()
        print event

if __name__ == "__main__":
    main()

撰写回答