为什么joyGetPos工作,而joyGetPosEx没有?

时间:2014-05-19 13:39:21

标签: c++ windows

目前使用操纵杆编写一个小程序,我很难理解joyGetPos()的工作原理,而joyGetPosEx()却没有。

我使用C ++做了一些基本的程序,这是我的第一个使用操纵杆的项目。

平台:Windows 7 64位

操纵杆:http://www.thrustmaster.com/en_UK/products/hotas-cougar

操纵杆上的文档功能:http://msdn.microsoft.com/en-us/library/windows/desktop/dd757121(v=vs.85).aspx

JOYINFO的代码

#include <iostream>
#include <stdio.h>
#include <string>
#include <Windows.h>


int main( int argc, char** argv )
{
    while ( true )
    {
        unsigned int num_dev = joyGetNumDevs();

        if ( 0 == num_dev )
        {
            std::cout << "[ERROR ] num_dev == 0" << std::endl;
        }

        /* JOYINFO */

        // retreiving the joystick values
        JOYINFO joyinfo;
        MMRESULT joygetpos_result = joyGetPos( JOYSTICKID1, &joyinfo );

        // if tested, joygetpos_result  does not produce any error

        // values change when playing with the stick
        std::cout << "joinfo.wXpos = " << joinfo.wXpos << std::endl;
        std::cout << "joinfo.wYpos = " << joinfo.wYpos << std::endl;
    }
}

这个版本相当不错,但18个大灰帽和4个按钮不起作用。

JOYINFOEX的代码

#include <iostream>
#include <stdio.h>
#include <string>
#include <Windows.h>


int main( int argc, char** argv )
{
    while ( true )
    {
        unsigned int num_dev = joyGetNumDevs();

        if ( 0 == num_dev )
        {
            std::cout << "[ERROR ] num_dev == 0" << std::endl;
        }


        /* JOYINFOEX */
        // retreiving the joystick values
        JOYINFOEX joyinfoex;
        MMRESULT joygetposex_result = joyGetPosEx( JOYSTICKID1, &joyinfoex);


        // error always produced
        if ( joygetposex_result == JOYERR_PARMS)
        {
            std::cout << "[ERROR ] JOYERR_PARMS" << std::endl;
        }

        // values does not change when playing with the stick
        std::cout << "joinfoex.dwXpos = " << joinfoex.dwXpos << std::endl;
        std::cout << "joinfoex.dwYpos = " << joinfoex.dwYpos << std::endl;

}

此第二个版本始终产生JOYERR_PARMS错误。我试图将JOYSTICKID1从1改为15,但没有任何成功。我想我没有正确使用Windows函数,但遗憾的是我无法理解使用它的正确方法。

你有同样的问题吗?我使用好的API来使用这样的操纵杆吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

来自MSDN page on joyGetPosEx

  

指向JOYINFOEX结构的指针,该结构包含操纵杆的扩展位置信息和按钮状态。您必须设置dwSize和dwFlags成员或joyGetPosEx将失败。

您需要使用大小和标志填充变量joyinfoex。

joyinfoex.dwSize = sizeof(joyinfoex);
joyinfoex.dwFlags = JOY_RETURNALL;