VS2017下C++通过JoyStick获取手柄按键事件--北通

一、背景介绍

把游戏手柄通过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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aspiretop

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值