为什么joyGetPos可以工作,而joyGetPosEx不行

Why joyGetPos works, and joyGetPosEx does not?

本文关键字:joyGetPosEx 不行 工作 joyGetPos 为什么      更新时间:2023-10-16

目前正在编写一个使用操纵杆的小程序,我很难理解为什么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,但没有任何成功。我想我没有正确地使用窗口函数,但不幸的是,我不能理解正确的方法来使用它。

你遇到过同样的问题吗?我是否使用了良好的API来使用这种操纵杆?

谢谢你的帮助。

来自joyGetPosEx的MSDN页面:

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

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

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