//获取摇杆信息
void CJoystickDlg::OnBnClickedButton1()
{
//JOYINFO joyinfo;//定义joystick信息结构体
JOYINFOEX joyinfoex; //对joystick结构体的扩充
joyinfoex.dwSize = sizeof(JOYINFOEX); //计算结构体的字节数
joyinfoex.dwFlags = JOY_RETURNALL; //返回全部按键状态
if (joyNum>=1)
{
CString str1;
GetDlgItem(IDC_EDIT2)->GetWindowText(str1);
joystick = _ttoi(str1);
if (joystick <1 || joystick>15)
{
MessageBox(_T("请输入有效的操作杆范围"));
}
joySetThreshold(joystick, 10000);
/*
joySetCapture(
hwnd, 处理窗口以接收操纵杆消息。
uJoyID, 要捕获的操纵杆的标识符。
uPeriod, 轮询频率,以毫秒为单位。
fChanged); 更改位置标志。将此参数指定为TRUE以仅在位置变化的值大于操纵杆移动阈值时发送消息。
否则,将以uPeriod 中指定的轮询频率发送消息。
*/
joySetCapture(m_hWnd, joystick, NULL, FALSE);
MMRESULT joyreturn = joyGetPosEx(joystick,&joyinfoex);//操作杆的有效范围为1-15
if (JOYERR_NOERROR == joyreturn)
{
TRACE("当前X坐标:%d", joyinfoex.dwXpos);
TRACE("当前Y坐标:%d", joyinfoex.dwYpos);
TRACE("当前Z坐标:%d ", joyinfoex.dwZpos);
TRACE("视点控制的当前位置:%d ", joyinfoex.dwPOV);
TRACE("32个操纵杆按钮的当前状态:%d ", joyinfoex.dwButtons);
TRACE("按下的当前按钮编号:%d ", joyinfoex.dwButtons);
}
else
{
switch (joyreturn)
{
case JOYERR_PARMS: //160+5
MessageBox(_T("指定的操纵杆标识符无效。"));
break;
case JOYERR_NOERROR://160+6
MessageBox(_T("操纵杆无法正常工作。"));
break;
case JOYERR_UNPLUGGED: //160+7
MessageBox(_T("指定的操纵杆未连接到系统。"));
break;
case MMSYSERR_NODRIVER:
MessageBox(_T("操纵杆驱动程序不存在。"));
break;
case MMSYSERR_INVALPARAM:
MessageBox(_T("传递了无效参数。"));
break;
case MMSYSERR_BADDEVICEID:
MessageBox(_T("指定的操纵杆标识符无效。"));
default:
MessageBox(_T("其他错误"));
break;
}
}
}
else
{
MessageBox(_T("系统不支持游戏操纵杆"));
}
}
//关闭窗口
void CJoystickDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
joyReleaseCapture(joystick);
CDialog::OnClose();
}
void CJoystickDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
::ShellExecute(NULL,
CString("open"),
CString("https://docs.microsoft.com/en-us/windows/win32/api/joystickapi/ns-joystickapi-joycaps"),
NULL, NULL,
SW_SHOWNORMAL);
}
void CJoystickDlg::OnSupportJoyStick()
{
JOYCAPSA jc;//创建结构体变量,用来获取摇杆支持的功能
MMRESULT joyInfo=joyGetDevCapsA(joystick, &jc, sizeof JOYCAPSA);//获取操纵杆功能的信息
if (JOYERR_NOERROR == joyInfo)
{
TRACE("制造商标识符:", jc.wMid);
TRACE("产品商标识符:", jc.wPid);
TRACE("产品名称:", jc.szPname);
TRACE("最小X坐标:", jc.wXmin);
TRACE("最大X坐标:", jc.wXmax);
TRACE("最小Y坐标:", jc.wYmin);
TRACE("最大Y坐标:", jc.wYmax);
TRACE("最小Z坐标:", jc.wZmin);
TRACE("最大Z坐标:", jc.wZmax);
TRACE("操纵杆数量:", jc.wNumButtons);
TRACE("最小轮询频率:", jc.wPeriodMin);
TRACE("最大轮询频率:", jc.wPeriodMax);
TRACE("最小舵值:", jc.wRmin);
TRACE("最大舵值:", jc.wRmax);
TRACE("最小U坐标:", jc.wUmin);
TRACE("最大U坐标:", jc.wUmax);
TRACE("最小V坐标:", jc.wVmin);
TRACE("最大V坐标:", jc.wVmax);
TRACE("操纵杆功能:", jc.wCaps);
TRACE("最大轴数:", jc.wMaxAxes);
TRACE("当前轴数:", jc.wNumAxes);
TRACE("最大按键数:", jc.wMaxButtons);
TRACE("注册表项:", jc.szRegKey);
TRACE("驱动程序oem:", jc.szOEMVxD);
CString strTemp;
strTemp.Format(_T("%s"), jc.szPname);
CString strInfo = _T("产品名称:") + strTemp;
GetDlgItem(IDC_EDIT_INFO)->SetWindowText(strInfo);
}
else
{
switch (joyInfo)
{
case JOYERR_PARMS: //160+5
MessageBox(_T("指定的操纵杆标识符无效。"));
break;
case JOYERR_NOERROR://160+6
MessageBox(_T("操纵杆无法正常工作。"));
break;
case JOYERR_UNPLUGGED: //160+7
MessageBox(_T("指定的操纵杆未连接到系统。"));
break;
case MMSYSERR_NODRIVER:
MessageBox(_T("操纵杆驱动程序不存在。"));
break;
case MMSYSERR_INVALPARAM:
MessageBox(_T("传递了无效参数。"));
break;
case MMSYSERR_BADDEVICEID:
MessageBox(_T("指定的操纵杆标识符无效。"));
default:
MessageBox(_T("其他错误"));
break;
}
}
}
JoyStick
最新推荐文章于 2022-07-17 16:40:59 发布