私はマウスのUSBドライバを扱っていますが、送信された情報を区別して使用する方法がわかりません/dev/input/mouse0
。/dev/input/mice
Googleで数回検索した後、使用方法に関するこのコードを見つけました。/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
、このファイルにはどのような情報が保存されるのでしょうか?
私の質問は次のとおりです:
- にはどのような情報が保存されますか
/dev/input/mouse0
? - 2 つのファイルを開かずに、優先順位の問題 (ホイール スクロール + X/Y 軸の移動) なしに、すべてのマウス情報を読み取るにはどうすればよいですか?
答え1
のLinux 入力サブシステム ユーザー空間 API ドキュメントあなたの質問に答えます。一般的に、すべてのファイル/dev/input/
はイベントハンドラデバイスイベントをユーザー空間に配信します。
/dev/input/mouse0 と /dev/input/mice とは何ですか?
から導入(重要な部分は私が強調しました)
1.3.1.3. マウスデバイス
mousedev は、マウス入力を使用するレガシー プログラムを動作させるためのハックです。マウスまたはデジタイザ/タブレットからイベントを取得し、PS/2 スタイル (/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
各マウスデバイスは、最後のマウスを除いて、1つのマウスまたはデジタイザに割り当てられます。この1つの文字デバイスは、すべてのマウスとデジタイザで共有されます。、何も接続されていない場合でも、デバイスは存在します。これは USB マウスのホットプラグに役立ち、ホットプラグに対応していない古いプログラムでも、マウスが存在しない場合でもデバイスを開くことができます。 [...]
Mousedev は、データを読み取るプログラムの要求に応じて、PS/2、ImPS/2 (Microsoft IntelliMouse)、または ExplorerPS/2 (IntelliMouse Explorer) プロトコルのいずれかを生成します。GPM と X をこれらのいずれかに設定できます。USBマウスのホイールを利用するにはImPS/2が必要です。追加のボタン(最大 5 個)を使用する場合は、ExplorerPS/2 を使用します。
...これは、マウス ホイール イベントが表示されない理由にもなります。これはレガシー プログラム用の「ハック」なので、必要がない限り使用しないでください。
マウスのすべての情報を読み取るにはどうすればよいですか? [...]
/dev/input/eventX
提供されている対応するファイルを使用してください。エヴデヴ(イベント ハンドラー。xorg ドライバー evdev と混同しないでください)。明らかに、2 番目のコード スニペットが行っているのはこれです。
...しかし、優先順位の問題はどうでしょうか?
優先順位の問題はありません。2.2. イベントコード:
SYN_レポート:
イベントを同期し、入力データの変更のパケットに分離するために使用されます。同じ瞬間に起こるたとえば、マウスの動きによって、1 つの動きに対して 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
私の場合は、OS のマウス イベントを実行しようとしました。コードは次の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'
}