MFC----JOYSTICK相关API函数对手柄进行控制

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得到手柄的控制信息,注意在调用此函数之前对jiexdwFlags进行了赋值(JOY_RETURNALL),得到手柄的控制信息后,模拟产生相应的按键消息。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值