【问题标题】:How to capture raw mouse input in X11?如何在 X11 中捕获原始鼠标输入?
【发布时间】:2011-01-15 07:10:48
【问题描述】:

对于我的应用程序的 Windows 版本,我使用 WM_INPUT 并直接注册鼠标设备以获得最精确的移动。我将如何在 X11 中执行此操作?

【问题讨论】:

    标签: input mouse x11 device


    【解决方案1】:

    有几种方法可以做到这一点,具体取决于您使用的框架。

    如果您打算使用 X11 编程的最基本方法“Xlib”来执行此操作,您应该查看Xlib manual,特别注意 XInput。 可以使用XI2(XInput 版本 2)检索更详细的信息

    其他更高级别的框架可以使事情变得更容易。看看Qt。这是我见过的最好的 GUI API 之一。

    如果您需要更多,请告诉我们。

    【讨论】:

      【解决方案2】:

      这里有 11 个链接,它们提供了参考、建议和两种不同的方法来获取 Linux 上的原始鼠标移动。 Link #2 (Python) 显示读取鼠标设备的传统方式,#1 (C)#3 (Python)#4 (C) 显示事件方式。 link #5 中介绍了 ps/2 协议。 Link #6 是一个命令行示例。

      这两种方法中的每一种都通过从设备驱动程序文件中获取 x 和 y 方向的增量流来绕过 X (Xlib)。 Xlib 不提供增量,传统上只提供窗口(或屏幕)位置,因此如果您想继续获取特定方向的读数,则必须不断将指针从窗口边缘移动。 [请参阅link #8 快速讨论许多程序使用 X 使用的“变形到中心”hack。] 然而,新的 XInput 2.0 扩展 (link #10) 提供了用于获取增量的 X API(您可能有至少链接 -lX11 和 -lXi)。

      这两种设备方法的本质是这样的:

      1:打开以读取“/dev/input/mouse0”设备或类似设备(这取决于您的发行版命名以及您要使用的方法,/dev/input/event4 用于其他方法)。

      2:从中读取。每这么多字节代表一次鼠标移动。例如,对于 ps/2 原始协议方法,例如,通过打开 mouse[n] 如上所述,如果您只关心 x、y 移动,则基本上只需要每 3 个字节序列的第 2 个和第 3 个字节。第二个字节代表 X。第三个代表 Y。两个字节中的每一个都是一个 int8_t(有符号 8 位)数量。正X好像在右边,没问题;然而,正 Y 似乎是向上的(就像在大多数数学教科书中一样),而在屏幕上,正 Y 通常被认为是从屏幕的左上角向下(而不是从左下角向上作为典型的原点)笛卡尔坐标系)。

      其他注意事项:如果您正在运行 X,您可能希望使用 open/read 而不是 fopen/getc(请参阅 link #7 和其他链接中的代码)。如果您想要前 3 个按钮的鼠标按钮状态或想要确认 x 或 y 的符号,那么还要查看第一个字节。 [我怀疑溢出是普通“流”使用中的一个问题,但这些位也存在。]如果您在 Linux 命令行上进行实验,您可能会注意到,例如,快速“猫”到“少”,大多数动作只是 1 个单位(很多 ^A ^@ 和 )。这可能取决于鼠标的配置方式以及鼠标的能力。 Link #5 涵盖了简单的协议,甚至涵盖了按钮 4 和 5 以及鼠标滚轮的 Microsoft 智能鼠标标准扩展。 Link #11 涵盖了 ps/2 鼠标或键盘的控制器芯片/逻辑配置。它解释了如何通过此界面配置鼠标。有一个工具 (link #9, xdotool) 可以模拟鼠标点击以帮助自动执行窗口任务。最后,您可能需要 root 权限才能直接从这些设备读取(取决于您的发行版)。

      【讨论】:

        猜你喜欢
        • 2017-10-28
        • 1970-01-01
        • 2023-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-06
        相关资源
        最近更新 更多