目前使用操纵杆编写一个小程序,我很难理解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来使用这样的操纵杆吗?
感谢您的帮助。
答案 0 :(得分:3)
指向JOYINFOEX结构的指针,该结构包含操纵杆的扩展位置信息和按钮状态。您必须设置dwSize和dwFlags成员或joyGetPosEx将失败。
您需要使用大小和标志填充变量joyinfoex。
joyinfoex.dwSize = sizeof(joyinfoex);
joyinfoex.dwFlags = JOY_RETURNALL;