joystick手柄驱动能捕获所有的手柄按键消息吗

我的手柄在电脑上没反应?我买的是Joystick的手柄!_百度知道如何用游戏手柄控制PC上的程序?
比如我写了一个程序,上面有四个按键(上下左右,如图)现在我的PC通过蓝牙/数据线与某一游戏手柄相连接(比如小米的游戏手柄),我如何将程序上的四个按键映射到手柄上去呢?有没有相关的文档(中/英文)。谢谢--------------------------------------------------------------------------------------------------------------------------------------------因为对这个方面实在不了解,全看知乎推荐邀请的。如有打扰,非常抱歉。如果能帮我邀请一个了解的就最好不过了 谢谢
这个方法是首选。
之前用DirectX的.Net封装库做过(用过俩,一个是微软自家的不过已经停止维护了,另一个是SlimDX),都挺简单的。
如果想要省心,推荐如果想自己编一个程序来用,祝你编程愉快。
已有帐号?
无法登录?
社交帐号登录推荐这篇日记的豆列
······Linux下游戏手柄(joystick)编程(二)
上次搜了些资料写了一个 《Linux下游戏手柄(joystick)编程 》但是我没有实验成功,后来发现我用的是archlinux系统,游戏手柄在archlinux下被识别为/dev/hidraw*的设备文件,直接读取这个文件就可以获得手柄的输入了。我实验了Logitech extreme 3D pro (罗技回旋钛翼二代)摇杆和北通神鹰手柄,用这个方法获取手柄输入效果良好。
后来经过研究发现,archlinux下手柄还有另外一个设备文件,在/dev/input/js*,采用《Linux下游戏手柄(joystick)编程 》里面的方法读取该文件,再次进行了实验,成功了,效果和直接读取/dev/hidraw*基本一样。
采用读取/dev/hidraw*的缺点是需要对不同的手柄,自己破解手柄按键动作后对应的字节位,而采用读取/dev/input/js*的好处是驱动自动对手柄按键的动作进行了映射,不需要自己去折腾按键对应的字节位了。
我用摄像头获取视频,用逻辑摇杆控制选择视频中目标的小程序的截屏:
采用读取/dev/hidraw*文件的方法,对于不同的手柄获取的输入不尽相同,为此我是把获取的输入都打印出来,然后分析哪几位对应哪个输入按键来寻找规律的,还好手柄的按键不多,不然非累死。
我发现如果要在程序中使用手柄作为输入,那么最好将读取输入的子程序弄成线程这样读取速度较快。有任何疑问欢迎交流。下面给出个简单的测试例子:
//testjoy.c
archlinux下编译采用gcc -lpthread -o testjoy testjoy.c
#include &sys/stat.h&
#include &unistd.h&
#include &stdio.h&
#include &sys/types.h&
#include &sys/fcntl.h&
#include &pthread.h&
#include &time.h&
struct joystick_button{
//存放手柄文件号
//x,y,z轴输入,这里我的手柄均采用模拟输入
//飞行摇杆的油门
int butlow,//按键状态
}//我自己定义的结构
//读取罗技摇杆
void read_logi(struct joystick_button *js)
char buf[20];
int * p1,*p2;
read(js-&fd, buf, 7);//罗技要读7个字节
joy.x=((*p1)&0x3ff)&&2;
joy.y=(((*p1)&0xfff00)&&12);
joy.z=(((*p1)&0xff000000)&&24);
joy.t=127-(((*p2)&0xfe0000)&&17);
joy.butlow=(((*p2)&0xff00)&&8);
joy.buthei=(((*p2)&0xf000000)&&24);
joy.aux=(((*p1)&0xe00000)&&21);
printf("%x %x x:%d y:%d z:%d t:%d butlow:%d buthei:%d aux:%d\n",*p1,*p2,joy.x,joy.y,joy.z,joy.t,joy.butlow,joy.buthei,joy.aux);
//读取北通神鹰
void read_bt(struct joystick_button *js)
char buf[20];
int * p1,*p2;
read(js-&fd, buf, 8);//神鹰需要读8个字节
js-&y=((*p1)&0xff000000)&&24;
js-&x=(((*p1)&0x00ff0000)&&16);
js-&z=(((*p1)&0xff000000)&&24);
js-&t=(((*p1)&0xff));
js-&butlow=(((*p2)&0xf000)&&12);
js-&buthei=(((*p2)&0xf0000)&&16);
js-&aux=(((*p1)&0xe00000)&&21);
printf("%x %x x:%d y:%d z:%d t:%d butlow:%d buthei:%d aux:%d\n",*p1,*p2,js-&x,js-&y,js-&z,js-&t,js-&butlow,js-&buthei,js-&aux);
pthread_t pthread_
joy.fd = open ("/dev/hidraw0", O_RDONLY);//打开手柄文件,你的有可能是hidraw1 2 等,实验一下就知道了
stat("/dev/hidraw0", &sbuf);
printf("/etc/hosts file size = %d\n", sbuf.st_rdev);
//joy.fd = open ("/dev/hidraw0", O_NONBLOCK);
if(joy.fd&0){printf("can not open joystick!\n");exit(0);}
pthread_join(&pthread_joy,NULL,(void *)read_logi,&joy);
//要是成需要执行其他任务就用pthread_join,
//测试北通神鹰就把read_logi换成read_bt就行了
2016年十月
10111213141516
17181920212223
24252627282930

我要回帖

更多关于 joystick手柄驱动 的文章

 

随机推荐