python - 在 Python 中通过 Xlib 找出鼠标按钮状态

标签 python linux xlib mouse-cursor

我可以通过以下方式确定当前鼠标指针的位置:

from Xlib.display import Display
display = Display()
qp = display.screen().root.query_pointer()
print(qp.root_x, qp.root_y)

我如何通过 Xlib 获取当前鼠标按钮状态,如按下/释放左/右按钮? (或者如果这不可能 - 为什么不呢?)

最佳答案

您的 X 窗口必须支持 XInput 扩展。 Real X 可以工作,但是如果 X 服务器不支持像 VNC 服务器这样的扩展,那么获取鼠标按钮将不起作用。

如果X server支持,那么你可以通过如下方式进入鼠标状态:

from Xlib.display import Display
from Xlib.ext import xinput

display = Display()

import time

while True:
    buttons = []

    for device_info in display.xinput_query_device(xinput.AllDevices).devices:
        if not device_info.enabled:
            continue
        if xinput.ButtonClass not in [ device_class.type for device_class in device_info.classes ]:
            continue
        buttons.append(device_info)

    for button in buttons:
        for device_class in button.classes:
            if xinput.ButtonClass == device_class.type:
                if device_class.state[0]:
                    print('Device {name} - Primary button down'.format(name=button.name))
    time.sleep(1)

我不是 100% 确定,因为在任何地方都找不到文档,但我很确定 device_class.state[0] 是主要的(左键),1 是中间的,2 是右键的。

你大概可以找到the button number assignment spec here

编辑:

为什么有两个 for 循环 - 首先我在 forever 循环之外写了“按钮”部分。但是,“嘿,你可以随时插入鼠标。”

您会发现,有很多设备,包括“虚拟”设备。在笔记本电脑上,触摸板也可以用作按钮,因此在您的应用程序中,如果您想知道真正的鼠标按钮,您可能需要从名称中选择一个设备。同样,没有好的文档,因此您可能必须破译设备类对象。您可以在/usr/lib/python3/dist-packages/Xlib/ext/xinput.py 中找到 xinput。 (如果您使用的是 Python2,请相应地进行调整。)祝您好运。

关于python - 在 Python 中通过 Xlib 找出鼠标按钮状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54992964/

相关文章:

python - 数据库更新后,如何获取 SQLAlchemy ORM 对象的先前状态?

java - 在 Linux 上从 eclipse 运行 ant build 时出错。无法从 ant 调用 wsimport

python 模块 BeautifulSoup importError

c++ - XRender 显示来自磁盘/应用程序生成图像的图片

python - 如何递归地将斐波那契数列插入二叉树

Python:将列表分解为所有可能的子列表

linux - rndc : error:/etc/bind/rndc. key :5: unknown option 'options' . 。无法加载 rndc 配置

ruby - 当前稳定的 ruby​​ xlib 包装器?

c++ - C++中的X11-调整窗口大小时只要设置ResizeRedirectMask,就会发生裁剪

python - Django 查询明确列出字段值的计数