一、背景介绍
把游戏手柄通过USB连接到电脑,如何通过C++获取手柄的按键响应呢?
可以通过 JoyStick库来实现,windows10下的VS2017自带这个库,所以可以直接用
二、代码
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<Windows.h>
#include<iostream>
//添加joystick操作api的支持库
#include<MMSystem.h>
#pragma comment(lib, "Winmm.lib")
#pragma warning(disable:4996)
int main(int argc, char* argv[])
{
JOYINFO joyinfo;//定义joystick信息结构体
JOYINFOEX joyinfoex;
joyinfoex.dwSize = sizeof(JOYINFOEX);
joyinfoex.dwFlags = JOY_RETURNALL;
while (1)
{
//读取手柄信息
UINT joyNums;
joyNums = joyGetNumDevs();
//printf("当前手柄数量:%d \n",joyNums);
if (joyNums >= 1)
{
MMRESULT joyreturn = joyGetPosEx(JOYSTICKID1, &joyinfoex);
if (joyreturn == JOYERR_NOERROR)
{
//方向键
if (joyinfoex.dwPOV == JOY_POVFORWARD)//前
{
printf("前\n");
}
if (joyinfoex.dwPOV == JOY_POVCENTERED)//默认没有按键时发送此信号
{
//printf("没有按键\n");
}
if (joyinfoex.dwPOV == JOY_POVRIGHT)//右
{
printf("右\n");
}
if (joyinfoex.dwPOV == JOY_POVBACKWARD)//后
{
printf("后\n");
}
if (joyinfoex.dwPOV == JOY_POVLEFT)//左
{
printf("左\n");
}
if (joyinfoex.dwXpos != 32767 || (joyinfoex.dwYpos != 32766&& joyinfoex.dwYpos != 32767))
{
//x,y中心为32767,x向右增大,y向下增大,范围为0-65535
std::cout << "左边(x,y) " << joyinfoex.dwXpos <<" "<< joyinfoex.dwYpos <<std::endl;
}
if (joyinfoex.dwUpos != 32767 || (joyinfoex.dwRpos != 32766&& joyinfoex.dwRpos != 32767))
{
//u,r中心为32767,u向右增大,r向下增大,范围为0-65535
std::cout << "右边(u,r) " << joyinfoex.dwUpos << " " << joyinfoex.dwRpos << std::endl;
}
if (joyinfoex.dwZpos == 128)
{
printf("按下手柄RT键,键值为:%d\n", joyinfoex.dwZpos);
}
if (joyinfoex.dwZpos == 65408)
{
printf("按下手柄LT键,键值为:%d\n", joyinfoex.dwZpos);
}
if (joyinfoex.dwButtons==16)
{
std::cout <<"按下手柄LB键, 键值为:"<<joyinfoex.dwButtons << std::endl;
}
if (joyinfoex.dwButtons == 32)
{
std::cout << "按下手柄RB键, 键值为:" << joyinfoex.dwButtons << std::endl;
}
if (joyinfoex.dwButtons == 1)
{
std::cout << "按下手柄A键, 键值为:" << joyinfoex.dwButtons << std::endl;
}
if (joyinfoex.dwButtons == 2)
{
std::cout << "按下手柄B键, 键值为:" << joyinfoex.dwButtons << std::endl;
}
if (joyinfoex.dwButtons == 4)
{
std::cout << "按下手柄X键, 键值为:" << joyinfoex.dwButtons << std::endl;
}
if (joyinfoex.dwButtons == 8)
{
std::cout << "按下手柄Y键, 键值为:" << joyinfoex.dwButtons << std::endl;
}
if (joyinfoex.dwButtons == 64)
{
std::cout << "按下手柄Back键, 键值为:" << joyinfoex.dwButtons << std::endl;
}
if (joyinfoex.dwButtons == 128)
{
std::cout << "按下手柄Start键, 键值为:" << joyinfoex.dwButtons << std::endl;
}
//可以进行组合按键,键值不同
}
else
{
switch (joyreturn)
{
case JOYERR_PARMS:
printf("bad parameters\n");
break;
case JOYERR_NOCANDO:
printf("request not completed\n");
break;
case JOYERR_UNPLUGGED:
printf("joystick is unplugged\n");
break;
default:
printf("未知错误\n");
break;
}
}
}
if (kbhit()) break;
Sleep(300);
}
return 0;
}