在Linux中使用Python获取鼠标增量!

16 投票
5 回答
15655 浏览
提问于 2025-04-16 10:57

我知道在Linux系统中,/dev/input/mice会输出一个9位的二进制补码数据。我也知道可以通过/dev/hidraw0获取这些数据,hidraw是你的USB设备,它会输出来自HID(人机接口设备)的原始数据。

我明白发送的数据是移动的变化量(位移),而不是具体的位置。顺便提一下,我也可以通过“cat /dev/input/mice”看到一些乱码数据。

我想用Python语言来读取这些数据。我希望能把这些数据以简单的整数形式获取,但这确实很难。真正的问题在于如何读取这些数据。有没有办法读取位数据并进行位运算?(目前我不担心root用户相关的问题,请假设这个脚本是以root身份运行的。)

(我的主要参考资料是http://www.computer-engineering.org/ps2mouse/

5 个回答

3

没错,Python可以以二进制的方式读取文件。你只需要在打开文件的时候加上一个 'b' 的标志,比如 open('dev/input/mice', 'rb')

Python还支持所有常见的位运算操作,比如位移、取反、按位与、按位或、异或和非等等。

不过,建议你使用一个库来处理这些数据,而不是自己手动去做,这样会更方便。

6

输入系统的数据是以结构体的形式输出的,而不是简单的整数。我觉得鼠标设备已经不再推荐使用了。现在更好的方法是使用事件设备接口,这样可以获取鼠标和其他输入事件。我写了一些代码来实现这个功能,可以参考一下这个Event.py模块,你可以直接使用它,或者在这个基础上进行修改。

20

我现在用的是一台基本的设备,无法访问X或其他东西,所以event.py这个文件不能正常工作。

所以我写了一个更简单的解码代码,用来从“过时的”'/dev/input/mice'中进行解释:

import struct

file = open( "/dev/input/mice", "rb" );

def getMouseEvent():
  buf = file.read(3);
  button = ord( buf[0] );
  bLeft = button & 0x1;
  bMiddle = ( button & 0x4 ) > 0;
  bRight = ( button & 0x2 ) > 0;
  x,y = struct.unpack( "bb", buf[1:] );
  print ("L:%d, M: %d, R: %d, x: %d, y: %d\n" % (bLeft,bMiddle,bRight, x, y) );
  # return stuffs

while( 1 ):
  getMouseEvent();
file.close();

撰写回答