/dev/input/mouse0 和 /dev/input/mice 之間的差異

/dev/input/mouse0 和 /dev/input/mice 之間的差異

我正在使用滑鼠 USB 驅動程序,但我真的不知道如何區分和使用/dev/input/mouse0和發送的信息/dev/input/mice

經過幾次谷歌搜尋後,我發現了這段關於使用的程式碼/dev/input/mice

int fd, bytes;
unsigned char data[4];

const char *pDevice = "/dev/input/mice";

// Open Mouse
fd = open(pDevice, O_RDWR);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pDevice);
    return -1;
}

int left, middle, right;
signed char x, y;

// Read Mouse
bytes = read(fd, data, sizeof(data));

if(bytes > 0)
{
    left = data[0] & 0x1;
    right = data[0] & 0x2;
    middle = data[0] & 0x4;

    x = data[1];
    y = data[2];
    printf("x=%d, y=%d, left=%d, middle=%d, right=%d\n", x, y, left, middle, right);

    if(left)
        return left;
    if(right)
        return right;
    if(middle)
        return middle;
}

return 0;

該程式有效,但沒有獲得有關滾輪滾動的任何資訊。

我找到了一個使用的程序/dev/input/event0

int fd;
struct input_event ev
const char* pFile = "/dev/input/event0";

fd = open(pFile, O_RDONLY);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pFile);are
    return -1;
}

read(fd, &ev, sizeof(ev));
std::cout << "type : " << ev.type << "  code : " << ev.code << "  value : " << ev.value << std::endl;

close(fd);

return 0;

但是對角線移動有一個問題,因為這個檔案同時只保存了1個座標,而且X座標優先於Y座標,所以當你想在Y軸上移動滑鼠時,這是相當煩人的。

我沒有找到任何可以使用的程式碼/dev/input/mouse0,那麼這個檔案中保存了哪些資訊呢?

我的問題是:

  1. 保存什麼資訊/dev/input/mouse0
  2. 如何在不開啟2個檔案且沒有優先權問題(滾輪滾動+X/Y軸移動)的情況下讀取所有滑鼠資訊?

答案1

Linux 輸入子系統使用者空間 API 文檔回答你的問題。一般來說,中的所有文件/dev/input/均由事件處理程序將設備事件分發到使用者空間。

/dev/input/mouse0 和 /dev/input/mice 是什麼?

來自介紹(重要部分我已經標示出來)

1.3.1.3。滑鼠開發

mousedev 是一種讓使用滑鼠輸入的遺留程式正常運作的 hack。它從滑鼠或數位轉換器/平板電腦取得事件,並使 PS/2 樣式(la /dev/psaux)滑鼠裝置可供使用者使用。

/dev/input 中的 Mousedev 裝置(如上圖)是:

crw-r--r--   1 root     root      13,  32 Mar 28 22:45 mouse0
crw-r--r--   1 root     root      13,  33 Mar 29 00:41 mouse1
crw-r--r--   1 root     root      13,  34 Mar 29 00:41 mouse2
crw-r--r--   1 root     root      13,  35 Apr  1 10:50 mouse3 ... 
...
crw-r--r--   1 root     root      13,  62 Apr  1 10:50 mouse30
crw-r--r--   1 root     root      13,  63 Apr  1 10:50 mice

每個滑鼠設備都分配給一個滑鼠或數位化儀,除了最後一個 - 滑鼠。這個單字元設備由所有滑鼠和數位化儀共享,即使沒有連接,該設備也存在。這對於熱插拔 USB 滑鼠非常有用,因此不處理熱插拔的舊程式即使在沒有滑鼠的情況下也可以打開裝置。 [...]

Mousedev 將產生 PS/2、ImPS/2 (Microsoft IntelliMouse) 或 ExplorerPS/2 (IntelliMouse Explorer) 協議,具體取決於讀取資料的程式的意願。您可以將 GPM 和 X 設定為其中任何一個。如果您想使用 USB 滑鼠上的滾輪,則需要 ImPS/2如果您想使用額外的(最多 5 個)按鈕,請使用 ExplorerPS/2。

……這也可能是您看不到滑鼠滾輪事件的原因。由於它是對遺留程式的“破解”,因此如果沒有必要,就不應該使用它。

我如何讀取所有滑鼠資訊[...]?

/dev/input/eventX使用由提供的相應文件埃夫德夫(事件處理程序,不要與 xorg-driver evdev 混淆)。這顯然就是你的第二個程式碼片段的作用。

……但是優先級問題呢?

不存在優先級問題。根據2.2.事件程式碼

SYN_報告:

用於同步事件並將其分離到輸入資料變更資料包中在同一時刻發生。例如,滑鼠的運動可以為一個運動設定 REL_X 和 REL_Y 值,然後發出 SYN_REPORT。下一個動作將發出更多 REL_X 和 REL_Y 值並發送另一個 SYN_REPORT。

由於事件之前的所有連續事件都SYN_REPORT可以被視為同時發生,因此報告的順序並不重要。

例如(使用這個程式我在github上找到的):

time:1528290186.256449  type:EV_REL     code:REL_X      value:-1
time:1528290186.256449  type:EV_REL     code:REL_Y      value:1
time:1528290186.256449  type:EV_SYN     code:SYN_REPORT value:0
time:1528290186.264460  type:EV_REL     code:REL_Y      value:1
time:1528290186.264460  type:EV_REL     code:REL_WHEEL  value:-1
time:1528290186.264460  type:EV_SYN     code:SYN_REPORT value:0

正如您所看到的,並發事件不僅被SYN_REPORT事件分開,而且還具有相同的時間戳記。

順便說一句,您也可以用來evtest查看裝置產生的事件。你可以找到它的原始碼這裡如果您對其工作原理感興趣。

答案2

就我而言,嘗試執行作業系統的滑鼠事件。我的程式碼app.js是:

var Mouse = require("./node_modules/node-mouse/mouse");
 
var m = new Mouse();
 
m.on("mousedown",function(event) {
    console.log(event);
});
 
m.on("mouseup",function(event) {
    console.log(event);
});
 
// same as mouseup, but fired after
m.on("click",function(event) {
    console.log(event);
});
 
 
m.on("mousemove", function(event) {
    console.log(event);
});

我之前在跑步node app.js

所以它給了我以下錯誤

Error: EACCES: permission denied, open '/dev/input/mice'
Emitted 'error' event on Mouse instance at:

sudo 所以就這樣運行

node app.js

不是它給出以下錯誤

{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 1,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}

相關內容