興味のある人のために、私は最終的にそれを行う方法を見つけました:
これを「ソース」デバイスで使用します (libEventInjector と一緒に使用できるネイティブ コードです):
int fd = open("/dev/input/eventX", O_RDONLY);
if(fd<0) return;
if(ioctl(fd,EVIOCGRAB,1) <0) return;
すべてがうまくいけば、ライブラリはデバイスに排他的にアクセスできるようになります。今度は、IME で読み取りを続けるスレッドを開始して/dev/input/eventX
、イベントを読み取ることができますが、イベントは他の場所には伝播しません。
更新: EVIOCGRAB は、Java クラスの関数のインスタンスにのみ排他制御を与えます。プログラムを閉じるときにデバイスをブロックせずにイベントをインターセプトする最良の方法は次のとおりです。
public class Class extends Thread{
boolean running = true;
public void run(){
mySourceDevice.getExclControl();
while(running){
}
mySourceDevice.releaseExclControl();
}
public void interrupt(){
runing=false;
super.interrupt();
}
}