gpt4 book ai didi

c++ windows中操纵杆编程

转载 作者:行者123 更新时间:2023-12-02 09:58:02 25 4
gpt4 key购买 nike

我想在 windows 中将操纵杆连接到我的 c++ qt 程序。我使用 microsoft guid for joystick program 中的 joystickapi 库学习了使用 win32 api 编程但是我不明白检查系统兼容性后该怎么办?
完成说明:
我的系统兼容性代码:

JOYINFO joyinfo;
UINT wNumDevs, wDeviceID;
BOOL bDev1Attached, bDev2Attached;
void joyCapablitis(){
if((wNumDevs = joyGetNumDevs()) == 0)
qDebug()<<"no driver available";
bDev1Attached = joyGetPos(JOYSTICKID1,&joyinfo) != JOYERR_UNPLUGGED;
bDev2Attached = wNumDevs == 2 && joyGetPos(JOYSTICKID2,&joyinfo) !=
JOYERR_UNPLUGGED;
if(bDev1Attached || bDev2Attached) // decide which joystick to use
{

wDeviceID = bDev1Attached ? JOYSTICKID1 : JOYSTICKID2;

}
else
qDebug()<<"no device available";

}
我想跟踪按钮的移动并在软件中进行模拟。如何从win32 api获取操纵杆信息(例如按钮数量和按钮打开或关闭)?

最佳答案

我以 Qt 模块的形式编写了一个 QJoystick 库,但它尚未发布。
这是Windows的一些代码。
首先,您需要初始化 DirectInput:

#include "comdef.h"

#define SAFE_DELETE(p) { if(p) { delete (p); (p) = nullptr; }}
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p) = nullptr; }}

#define AS(x, p) reinterpret_cast<x>(p)

BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE* deviceInstance, void* controller);
BOOL CALLBACK EnumObjectsCallback (const DIDEVICEOBJECTINSTANCE* objectInstance, void* controller);

static LPDIRECTINPUT8 DirectInputPtr = nullptr;

HRESULT hr;

if (DirectInputPtr == nullptr)
{
if (FAILED(hr = DirectInput8Create(GetModuleHandle(nullptr), DIRECTINPUT_VERSION, IID_IDirectInput8, AS(void**, &DirectInputPtr), nullptr)))
qCritical("QJoystick failed to obtain direct input interface: %s", qPrintable(hrError(hr)));
}
二、设置回调:
if (DirectInputPtr)
{
if (FAILED(hr = DirectInputPtr->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, this, DIEDFL_ATTACHEDONLY)))
qDebug("QJoystick EnumDevices failed");

if (joystickPtr)
{
if (FAILED(hr = joystickPtr->SetDataFormat(&c_dfDIJoystick2)))
qWarning("QJoystick: failed to set data format for id %d", deviceId);

if (SUCCEEDED(hr = joystickPtr->EnumObjects(EnumObjectsCallback, this, DIDFT_ALL)))
{
DIDEVICEINSTANCE joystickinfo;
joystickinfo.dwSize = sizeof(joystickinfo);

if (FAILED(hr = joystickPtr->GetDeviceInfo(&joystickinfo)))
{
qCritical() << "QJoystick GetDeviceInfo failed:" << hrError(hr);
SAFE_RELEASE(joystickPtr)
}

description = QString::fromWCharArray(joystickinfo.tszProductName);
guid = QString("%1").arg(joystickinfo.guidProduct.Data1, 8, 16, QLatin1Char('0'));
}
else
qCritical("QJoystick: set callback on EnumObjects failed for %d", deviceId);
}
}
EnumJoysticksCallback是您为操纵杆创建虚拟设备的地方:
BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE* deviceInstance, void* pController)
{
QJoystickPrivate* controller = AS(QJoystickPrivate*, pController);
BOOL result = DIENUM_CONTINUE;

if (controller->enumCounter == controller->deviceId)
{
HRESULT hr = DirectInputPtr->CreateDevice(deviceInstance->guidInstance, &(controller->joystickPtr), nullptr);

if (SUCCEEDED(hr))
result = DIENUM_STOP;
else
qWarning("QJoystick: CreateDevice failed %d", controller->deviceId);
}
else
++controller->enumCounter;

return result;
}
EnumObjectsCallback将在枚举过程中为每个按钮或轴执行:
BOOL CALLBACK EnumObjectsCallback(const DIDEVICEOBJECTINSTANCE* objectInstance, void* pController)
{
QJoystickPrivate* controller = AS(QJoystickPrivate*, pController);

//Set the range for axis
if (objectInstance->dwType & DIDFT_AXIS)
{
DIPROPRANGE diprg;

diprg.diph.dwSize = sizeof(DIPROPRANGE);
diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER);
diprg.diph.dwHow = DIPH_BYID;
diprg.diph.dwObj = objectInstance->dwType; // Specify the enumerated axis

diprg.lMin = -1000;
diprg.lMax = +1000;

if (FAILED(controller->joystickPtr->SetProperty(DIPROP_RANGE, &diprg.diph)))
return DIENUM_STOP;
}

if (objectInstance->guidType == GUID_XAxis || objectInstance->guidType == GUID_YAxis || objectInstance->guidType == GUID_ZAxis ||
objectInstance->guidType == GUID_RxAxis || objectInstance->guidType == GUID_RyAxis || objectInstance->guidType == GUID_RzAxis ||
objectInstance->guidType == GUID_Slider)
{
// axis
}
else if (objectInstance->guidType == GUID_POV)
// pov...
else if (objectInstance->guidType == GUID_Button)
// button...
else if (objectInstance->guidType == GUID_Unknown)
// unknown...

return DIENUM_CONTINUE;
}

关于c++ windows中操纵杆编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64314175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com