我用的是北通宙斯游戏手柄-白金
放几篇非常不错的文章
1.JoyStick游戏杆编程实践_32768的博客-CSDN博客_joystick
2.游戏手柄(JoyStick)编程学习笔记(1)_liyuanbhu的博客-CSDN博客
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<Windows.h>
//添加joystick操作api的支持库
#include<MMSystem.h>
#pragma comment(lib, "Winmm.lib")
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)
{
printf("0x%09d ", joyinfoex.dwXpos);
printf("0x%09d ", joyinfoex.dwYpos);
//printf("0x%09X ", joyinfoex.dwZpos);
//printf("0x%09X ", joyinfoex.dwPOV);
//printf("0x%09X ", joyinfoex.dwButtons);
printf("\n");
}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;
}
第一步:需要包含外部库,我用的QT开发,需要在.pro文件中添加
LIBS += -lWinmm
包含以下的头文件
#include <Windows.h>
#include <WinUser.h>
#include <MMsystem.h>
第二步:查询游戏手柄按键信息
1.方向键(前、后、左、右)
按键 | 访问方式 | 键值 |
前 | joyinfoex.dwPOV | JOY_POVFORWARD |
后 | joyinfoex.dwPOV | JOY_POVBACKWARD |
左 | joyinfoex.dwPOV | JOY_POVLEFT |
右 | joyinfoex.dwPOV | JOY_POVRIGHT |
默认状态 | joyinfoex.dwPOV | JOY_POVCENTERED |
默认没有按键的时候发送 JOY_POVCENTERED 信号
//方向键
if (joyinfoex.dwPOV == JOY_POVFORWARD)//前
{
printf("前");
}
if (joyinfoex.dwPOV == JOY_POVCENTERED)//默认没有按键时发送此信号
{
printf("宫保鸡丁");
}
if (joyinfoex.dwPOV == JOY_POVRIGHT)//右
{
printf("右");
}
if (joyinfoex.dwPOV == JOY_POVBACKWARD )//后
{
printf("后");
}
if (joyinfoex.dwPOV == JOY_POVLEFT)//左
{
printf("左");
}
2.获取32个按键按下,可以进行组合。
按键 | 访问方式 | 键值 |
32个组合按键 | joyinfoex.dwButtons | 通过函数测 |
3.获取摇杆、LT\RT信息
(1)、左摇杆,通过xy的坐标来读取,原点是32767
(2)、右摇杆通过ur的坐标来读取,原点是32767
按键 | 访问方式 | 键值 |
左摇杆 | x坐标:joyinfoex.dwXpos | 0-65535 |
y坐标:joyinfoex.dwYpos | 0-65535 | |
右摇杆 | u坐标:joyinfoex.dwUpos | 0-65535 |
r坐标:joyinfoex.dwRpos | 0-65535 | |
LT\RT | joyinfoex.dwZpos 没有按键按下: RT按下: LT按下: | 32767 32767 - 128 32767 - 65408 |
if (joyinfoex.dwXpos<32767 && joyinfoex.dwYpos>32767)
{
printf("宫保鸡丁");
}
printf("%d", joyinfoex.dwXpos);
printf("%d", joyinfoex.dwYpos);
printf("%d", joyinfoex.dwZpos);
if (joyinfoex.dwZpos == 128)
{
printf("宫保鸡丁");
}
printf("%d", joyinfoex.dwUpos);
printf("%d", joyinfoex.dwRpos);
这样就可以读取手柄上的按键信息,进行判断。