对于我的应用程序的Windows版本,我正在使用WM_INPUT并直接注册鼠标设备以获得最精确的移动。如何在X11中实现这一点?
以下是11个链接,提供参考、建议和两种不同的方法来在Linux上获取原始鼠标移动。链接2 (Python)显示了读取鼠标设备的传统方式,链接1 (C)、链接3 (Python)和链接4 (C) 展示了事件方式。PS/2协议在链接5中介绍。链接6是一个命令行示例。
每种方法都通过从设备驱动程序文件中获取x和y方向的增量流来绕过X(Xlib)。与增量不同,Xlib传统上只提供窗口(或屏幕)位置,因此如果您想在特定方向上持续获取读数,则必须将指针移动到窗口边缘。[有关许多使用X的程序使用“居中扭曲”技巧的快速讨论,请参见链接#8。]然而,新的XInput 2.0扩展(链接#10)提供了一个用于获取增量的X API(您可能需要至少链接-lX11和-lXi)。2:从中读取内容。每隔一定字节表示一次鼠标移动。例如,对于PS / 2原始协议方法,通过像上面那样打开鼠标[n],如果您只关心x、y移动,则基本上只需要每个3字节序列的第2个和第3个字节。第二个字节代表X,第三个字节代表Y。这两个字节都是int8_t(有符号8位)类型。正X似乎向右移动,没有问题;但是,正Y似乎向上移动(与大多数数学教材相同),而在屏幕上,正Y通常被认为是从屏幕左上角向下移动(相对于典型笛卡尔坐标系中的原点从左下方向上移动)。
其他注意事项:如果您正在运行X(参见链接#7和其他链接中的代码),则可能希望使用open/read而不是fopen/getc。如果您想要前3个按钮的鼠标按钮状态或想要确认x或y的符号,则也可以查看第一个字节。【我怀疑在普通的“流”使用中溢出不是问题,但这些位也在那里。】您可能会注意到,如果在Linux命令行上进行实验,例如快速将“cat”转换为“less”,则大多数移动只是1个单位(很多^A ^@和<FF>)。这可能取决于鼠标的配置方式以及鼠标的能力如何。链接#5涵盖了简单协议,甚至涵盖了微软Intellimouse标准扩展按钮4和5以及鼠标滚轮。链接#11涵盖了ps/2鼠标或键盘的控制器芯片/逻辑配置。它解释了通过此接口配置鼠标的方法。有一个工具(链接#9,xdotool)可以模拟鼠标点击以帮助自动化窗口任务。最后,您可能需要成为root才能直接从这些设备中读取(取决于您的发行版)。