如何在C++; 我有C++代码,它正确拦截了我的赛钛客CyBog游戏杆的操纵杆X和Y位置。

如何在C++; 我有C++代码,它正确拦截了我的赛钛客CyBog游戏杆的操纵杆X和Y位置。,c++,windows,joystick,borland-c++,C++,Windows,Joystick,Borland C++,这个操纵杆也有能力绕手柄轴旋转,我正试图获得这个动作的信息 对于x和y,消息ID为MM_JOY1MOVE和MM_JOY2MOVE,它们允许我捕获斗杆的x和y位置 对于z轴,有MM_JOY1ZMOVE和MM_JOY2ZMOVE,但它们都不能捕捉扭曲运动 在mmsystem.h中可以找到以下定义: .... #define MM_JOY1MOVE 0x3A0 /* joystick */ #define MM_JOY2MOVE 0x3A1 #def

这个操纵杆也有能力绕手柄轴旋转,我正试图获得这个动作的信息

对于x和y,消息ID为MM_JOY1MOVE和MM_JOY2MOVE,它们允许我捕获斗杆的x和y位置

对于z轴,有MM_JOY1ZMOVE和MM_JOY2ZMOVE,但它们都不能捕捉扭曲运动

在mmsystem.h中可以找到以下定义:

....
#define MM_JOY1MOVE         0x3A0           /* joystick */
#define MM_JOY2MOVE         0x3A1
#define MM_JOY1ZMOVE        0x3A2
#define MM_JOY2ZMOVE        0x3A3
#define MM_JOY1BUTTONDOWN   0x3B5
#define MM_JOY2BUTTONDOWN   0x3B6
#define MM_JOY1BUTTONUP     0x3B7
#define MM_JOY2BUTTONUP     0x3B8
...
但这些都不起作用


问题是:z-twist运动的消息ID是什么,或者我如何找到它?

我们不确定z-twist是什么意思(如果它是模拟轴或仅是POV按钮),但我用
JOYINFOEX
JOYCAPS
处理操纵手柄,如下所示:

//---------------------------------------------------------------------------
//--- Spektres Joystick class ver: 1.1 --------------------------------------
//---------------------------------------------------------------------------
#ifndef _joystick_h
#define _joystick_h
//---------------------------------------------------------------------------
//#include <dinput.h>
#include <Mmsystem.h>

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
const int _joystick_max=16;
//---------------------------------------------------------------------------
class joystick
        {
public: int _enable_double;
        int _x,_y,_z,_r,_u,_v,_pov; // status non zero ?
        double x,y,z,r,u,v,pov;     // pos
        double x0,y0,z0,r0,u0,v0;   // min
        double dx,dy,dz,dr,du,dv;   // 2/(max-min)
        double deadzone;
        DWORD  buttons;

        JOYINFOEX joy_info;
        JOYCAPS joy_cp;
        int joy_list[_joystick_max],joy_num;
        int joy_id;
        joystick() { deadzone=0.1; _enable_double=1; joy_id=-1; joy_num=0; init_list(); }
        joystick(joystick& a) { *this=a; }
        ~joystick()    {}
        joystick* operator = (const joystick *a) { *this=*a; return this; }
        //joystick* operator = (const joystick &a) { ...copy... return this; }
        void init_list();
        void refresh();
        void refresh_cp();
        };
//---------------------------------------------------------------------------
void joystick::init_list()
        {
        int i,j;
        joy_num=0;
        j=JOYSTICKID1;
        for (i=0;i<_joystick_max;i++)
            {
            joy_info.dwSize = sizeof(JOYINFOEX);
            joy_info.dwFlags=JOY_RETURNALL;
            if (joyGetPosEx(i,&joy_info)==JOYERR_NOERROR)
                {
                joy_list[joy_num]=i;
                joy_num++;
                j++;
                }
            }
        j=0;
        for (i=0;i<joy_num;i++)
         if (joy_list[i]==joy_id)
          { j=1; break; }
        if (!j)
            {
            joy_id=-1;
            if (joy_num>0) joy_id=joy_list[0];
            }
        refresh();
        refresh_cp();
        }
//---------------------------------------------------------------------------
void joystick::refresh()
        {
        if (joy_id==-1) return;
        joy_info.dwSize = sizeof(JOYINFOEX);
        joy_info.dwFlags=JOY_RETURNALL;
        joyGetPosEx(joy_id,&joy_info);
        if (_enable_double)
            {
            x=double(joy_info.dwXpos-x0)*dx-1.0;
            y=double(joy_info.dwYpos-y0)*dy-1.0;
            z=double(joy_info.dwZpos-z0)*dz-1.0;
            r=double(joy_info.dwRpos-r0)*dr-1.0;
            u=double(joy_info.dwUpos-u0)*du-1.0;
            v=double(joy_info.dwVpos-v0)*dv-1.0;
            pov=double(joy_info.dwPOV)*0.01;
            _x=0; if (x<=-deadzone) { _x=1; x+=deadzone; } if (x>=+deadzone) { _x=1; x-=deadzone; }
            _y=0; if (y<=-deadzone) { _y=1; y+=deadzone; } if (y>=+deadzone) { _y=1; y-=deadzone; }
            _z=0; if (z<=-deadzone) { _z=1; z+=deadzone; } if (z>=+deadzone) { _z=1; z-=deadzone; }
            _r=0; if (r<=-deadzone) { _r=1; r+=deadzone; } if (r>=+deadzone) { _r=1; r-=deadzone; }
            _u=0; if (u<=-deadzone) { _u=1; u+=deadzone; } if (u>=+deadzone) { _u=1; u-=deadzone; }
            _v=0; if (v<=-deadzone) { _v=1; v+=deadzone; } if (v>=+deadzone) { _v=1; v-=deadzone; }
            _pov=1; if (joy_info.dwPOV==65535) _pov=0;
            buttons=joy_info.dwButtons;
            }
        }
//---------------------------------------------------------------------------
void joystick::refresh_cp()
        {
        if (joy_id==-1) return;
        joyGetDevCaps(joy_id,&joy_cp,sizeof(JOYCAPS));
        double q=2.0+deadzone+deadzone;
        x0=joy_cp.wXmin; dx=joy_cp.wXmax-x0; if (dx) dx=q/dx;
        y0=joy_cp.wYmin; dy=joy_cp.wYmax-y0; if (dy) dy=q/dy;
        z0=joy_cp.wZmin; dz=joy_cp.wZmax-z0; if (dz) dz=q/dz;
        r0=joy_cp.wRmin; dr=joy_cp.wRmax-r0; if (dr) dr=q/dr;
        u0=joy_cp.wUmin; du=joy_cp.wUmax-u0; if (du) du=q/du;
        v0=joy_cp.wVmin; dv=joy_cp.wVmax-v0; if (dv) dv=q/dv;
        }
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
这可以处理6个模拟轴+POV按钮+您想要的所有按钮

Win2000编写了它,但仍然在Win7 x64中使用我的4个axises+POV+7个按钮天才操纵杆:)(必须去掉灰尘,它已经好几年没用了)

PS.


这是一个非常古老的源代码,所以我需要将其添加到其中以确定。

我不确定Z扭曲是什么意思(如果它是模拟轴或仅是POV按钮),但我使用
JOYINFOEX
JOYCAPS
处理操纵手柄,如下所示:

//---------------------------------------------------------------------------
//--- Spektres Joystick class ver: 1.1 --------------------------------------
//---------------------------------------------------------------------------
#ifndef _joystick_h
#define _joystick_h
//---------------------------------------------------------------------------
//#include <dinput.h>
#include <Mmsystem.h>

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
const int _joystick_max=16;
//---------------------------------------------------------------------------
class joystick
        {
public: int _enable_double;
        int _x,_y,_z,_r,_u,_v,_pov; // status non zero ?
        double x,y,z,r,u,v,pov;     // pos
        double x0,y0,z0,r0,u0,v0;   // min
        double dx,dy,dz,dr,du,dv;   // 2/(max-min)
        double deadzone;
        DWORD  buttons;

        JOYINFOEX joy_info;
        JOYCAPS joy_cp;
        int joy_list[_joystick_max],joy_num;
        int joy_id;
        joystick() { deadzone=0.1; _enable_double=1; joy_id=-1; joy_num=0; init_list(); }
        joystick(joystick& a) { *this=a; }
        ~joystick()    {}
        joystick* operator = (const joystick *a) { *this=*a; return this; }
        //joystick* operator = (const joystick &a) { ...copy... return this; }
        void init_list();
        void refresh();
        void refresh_cp();
        };
//---------------------------------------------------------------------------
void joystick::init_list()
        {
        int i,j;
        joy_num=0;
        j=JOYSTICKID1;
        for (i=0;i<_joystick_max;i++)
            {
            joy_info.dwSize = sizeof(JOYINFOEX);
            joy_info.dwFlags=JOY_RETURNALL;
            if (joyGetPosEx(i,&joy_info)==JOYERR_NOERROR)
                {
                joy_list[joy_num]=i;
                joy_num++;
                j++;
                }
            }
        j=0;
        for (i=0;i<joy_num;i++)
         if (joy_list[i]==joy_id)
          { j=1; break; }
        if (!j)
            {
            joy_id=-1;
            if (joy_num>0) joy_id=joy_list[0];
            }
        refresh();
        refresh_cp();
        }
//---------------------------------------------------------------------------
void joystick::refresh()
        {
        if (joy_id==-1) return;
        joy_info.dwSize = sizeof(JOYINFOEX);
        joy_info.dwFlags=JOY_RETURNALL;
        joyGetPosEx(joy_id,&joy_info);
        if (_enable_double)
            {
            x=double(joy_info.dwXpos-x0)*dx-1.0;
            y=double(joy_info.dwYpos-y0)*dy-1.0;
            z=double(joy_info.dwZpos-z0)*dz-1.0;
            r=double(joy_info.dwRpos-r0)*dr-1.0;
            u=double(joy_info.dwUpos-u0)*du-1.0;
            v=double(joy_info.dwVpos-v0)*dv-1.0;
            pov=double(joy_info.dwPOV)*0.01;
            _x=0; if (x<=-deadzone) { _x=1; x+=deadzone; } if (x>=+deadzone) { _x=1; x-=deadzone; }
            _y=0; if (y<=-deadzone) { _y=1; y+=deadzone; } if (y>=+deadzone) { _y=1; y-=deadzone; }
            _z=0; if (z<=-deadzone) { _z=1; z+=deadzone; } if (z>=+deadzone) { _z=1; z-=deadzone; }
            _r=0; if (r<=-deadzone) { _r=1; r+=deadzone; } if (r>=+deadzone) { _r=1; r-=deadzone; }
            _u=0; if (u<=-deadzone) { _u=1; u+=deadzone; } if (u>=+deadzone) { _u=1; u-=deadzone; }
            _v=0; if (v<=-deadzone) { _v=1; v+=deadzone; } if (v>=+deadzone) { _v=1; v-=deadzone; }
            _pov=1; if (joy_info.dwPOV==65535) _pov=0;
            buttons=joy_info.dwButtons;
            }
        }
//---------------------------------------------------------------------------
void joystick::refresh_cp()
        {
        if (joy_id==-1) return;
        joyGetDevCaps(joy_id,&joy_cp,sizeof(JOYCAPS));
        double q=2.0+deadzone+deadzone;
        x0=joy_cp.wXmin; dx=joy_cp.wXmax-x0; if (dx) dx=q/dx;
        y0=joy_cp.wYmin; dy=joy_cp.wYmax-y0; if (dy) dy=q/dy;
        z0=joy_cp.wZmin; dz=joy_cp.wZmax-z0; if (dz) dz=q/dz;
        r0=joy_cp.wRmin; dr=joy_cp.wRmax-r0; if (dr) dr=q/dr;
        u0=joy_cp.wUmin; du=joy_cp.wUmax-u0; if (du) du=q/du;
        v0=joy_cp.wVmin; dv=joy_cp.wVmax-v0; if (dv) dv=q/dv;
        }
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
这可以处理6个模拟轴+POV按钮+您想要的所有按钮

Win2000编写了它,但仍然在Win7 x64中使用我的4个axises+POV+7个按钮天才操纵杆:)(必须去掉灰尘,它已经好几年没用了)

PS.


这是非常旧的源代码,所以我需要将其添加到其中,以确保其正确性。

为您添加了答案,heh刚刚发现您标记了
borland-c++
我在BCB5中使用BDS2006制作了此代码,因此您在使用添加的答案时不会遇到任何问题,heh刚刚发现您标记了
borland-c++
我在BCB5中使用了BDS2006,所以您在使用iThanks进行代码和注释时应该不会遇到任何问题。我将研究Joyinfoex结构,看看是否可以从中获得我的值。看来你在投票。我不是轮询,而是处理操纵杆消息。@Tottekarsson是的,我知道,但我不确定您是否可以提取高级操纵杆的消息,因为它们仅由
JOYINFOEX
修补,并且来自
dinput
(这是directX的一部分,它的回调非常混乱,大多数情况下无法正常工作,或者根本无法正常工作,尤其是在声音方面)。轮询速度没有太慢。我通常在计时器中使用它,大约
20-40ms
如果您收到要工作的消息,请告诉我(我很久以前就放弃了)。感谢您的代码和评论。我将查看Joyinfoex结构,看看是否可以从中获取我的值。您似乎正在轮询。我没有轮询,而是在处理操纵杆消息。@Tottekarsson是的,我知道,但我不确定您是否可以提取高级操纵杆的消息,因为它们只能通过
Joyinfoex
并且来自
dinput
(这是directX的一部分,它的回调非常混乱,大部分都不能正常工作,或者根本不能正常工作,尤其是在声音方面)。轮询没有太慢。我通常在
20-40ms左右的计时器中使用它。如果您收到消息,请告诉我(我很久以前就放弃了)。