用JOYSTICK相关API函数对手柄进行控制,下面是用到的相关函数:
joyGetNumDevs获取当前系统支持的游戏设备数量(本人通过调用此函数来判断系统时候支持手柄)
joyGetDevCaps查询指定设备的性能(本人通过此函数来判断指定设备是否存在)
joyGetPos获取游戏设备的坐标位置以及按钮状态
joyGetPosEx获取游戏设备的坐标位置以及按钮状态(本人通过此函数来得到手柄的控制信息)
以上是本人在程序中用到函数,还有几个函数,下面只列出两个函数:
joySetCapture向系统申请捕获某个游戏设备并定时将设备的状态值通过消息发送到某个窗口
joyReleaseCapture释放某个游戏设备的捕获
下面还有两组函数,用于模拟鼠标和键盘发送消息:
keybd_event
mouse_event
上面两个函数用于得到了手柄控制系统后,模拟产生相关的键盘和鼠标消息
下面通过分析部分程序来看上面函数的使用:
首先要使用上述函数必须添加对应的头文件和库文件:
#include<MMSystem.h>
#pragmacomment(lib,"winmm.lib")
然后判断手柄是否可用以及初始化相关信息:
boolbJoyStickCanUse()
{
JOYCAPS jc;
if(0>=joyGetNumDevs())//判断系统支持的手柄数目
return false;
if(JOYERR_NOERROR!=joyGetDevCaps(JOYSTICKID1,&jc,sizeof(jc)))//判断ID1手柄是否可以使用
return false;
uiXmid=(jc.wXmin+jc.wXmax)/2;//x轴的中间位置
uiYmid=(jc.wYmin+jc.wYmax)/2;//y轴的中间位置
uiLeft=(uiXmid+jc.wXmin)/2;//左转的阀值
uiRight=(uiXmid+jc.wXmax)/2;//右转的阀值
uiUp=(uiYmid+jc.wYmax)/2;//爬升的阀值
uiDown=(uiYmid+jc.wYmin)/2;//下滑的阀值
return true;
}
上面之所以上计算手柄的左转右转阀值等,是因为,手柄的方向控制盘在函数中得到的是一段区间的值。
最后得到手柄的控制信息并进行相关操作:
unsigned WINAPIkeyboardProc(void*)
{
JOYINFOEXjiex;
while(1)
{
if(!bJoyStickCanUse())
continue;
jiex.dwFlags=JOY_RETURNALL;
if(JOYERR_NOERROR!=joyGetPosEx(JOYSTICKID1,&jiex))
continue;
if(jiex.dwXpos<=uiLeft)
{
keybd_event(byteLeft,MapVirtualKey(byteLeft,0),0,0);
Sleep(50);
keybd_event(byteLeft,MapVirtualKey(byteLeft,0),KEYEVENTF_KEYUP,0);
//cout<<"left"<<endl;
}
if(jiex.dwXpos>=uiRight)
{
keybd_event(byteRight,MapVirtualKey(byteRight,0),0,0);
Sleep(50);
keybd_event(byteRight,MapVirtualKey(byteRight,0),KEYEVENTF_KEYUP,0);
//cout<<"right"<<endl;
}
if(jiex.dwYpos<=uiDown)
{
keybd_event(byteUp,MapVirtualKey(byteUp,0),0,0);
Sleep(50);
keybd_event(byteUp,MapVirtualKey(byteUp,0),KEYEVENTF_KEYUP,0);
//cout<<"left"<<endl;
}
if(jiex.dwYpos>=uiUp)
{
keybd_event(byteDown,MapVirtualKey(byteDown,0),0,0);
Sleep(50);
keybd_event(byteDown,MapVirtualKey(byteDown,0),KEYEVENTF_KEYUP,0);
//cout<<"right"<<endl;
}
if(jiex.dwButtonNumber>0)
{
for(inti=0;i<32;++i)
{
if(jiex.dwButtons&(1<<i))
{
keybd_event(byteButton[i],MapVirtualKey(byteButton[i],0),0,0);
Sleep(50);
keybd_event(byteButton[i],MapVirtualKey(byteButton[i],0),KEYEVENTF_KEYUP,0);
}
}
}
Sleep(150);
}
return1;
}
函数中先是判断手柄ID1是否可用,然后调用joyGetPosEx得到手柄的控制信息,注意在调用此函数之前对jiex的dwFlags进行了赋值(JOY_RETURNALL),得到手柄的控制信息后,模拟产生相应的按键消息。