Win32 C++ Xinput 获取XBOX控制器所有按键(含Guide 西瓜键 按钮)

52 篇文章 0 订阅
30 篇文章 0 订阅
#include <string>
#include <iostream>
#include <windows.h>
#include <tchar.h>

#ifdef _UNICODE
using _tstring = std::wstring;
#else
using _tstring = std::string;
#endif

void LogPrintf(LPCTSTR pFormat, ...);

#define XINPUT_GAMEPAD_GUIDE    (0x0400)

int main()
{
    
    HINSTANCE hModule = LoadLibrary(_T("XInput1_4.dll"));
    if (NULL == hModule)
    {
        hModule = LoadLibrary(_T("xinput1_3.dll"));
    }

    if (NULL == hModule)
    {
        return -1;
    }

    typedef struct _XINPUT_GAMEPAD_EX
    {
        DWORD                               wError;
        DWORD                               dwPacketNumber;
        WORD                                wButtons;
        BYTE                                bLeftTrigger;
        BYTE                                bRightTrigger;
        SHORT                               sThumbLX;
        SHORT                               sThumbLY;
        SHORT                               sThumbRX;
        SHORT                               sThumbRY;
    } XINPUT_GAMEPAD_EX, * PXINPUT_GAMEPAD_EX;

    typedef int(__stdcall* _XInputGetStateEx)(DWORD dwUserIndex, XINPUT_STATE* pState);
    typedef int(__stdcall* _XInputWaitForGuideButton)(DWORD dwUserIndex, DWORD dwFlags, XINPUT_GAMEPAD_EX* pState);
    typedef int(__stdcall* _XInputCancelGuideButtonWait)(DWORD dwUserIndex);
    typedef int(__stdcall* _XInputPowerOffController)(DWORD dwUserIndex);

    _XInputGetStateEx XInputGetStateEx = (_XInputGetStateEx)::GetProcAddress(hModule, (LPCSTR)100);
    _XInputWaitForGuideButton XInputWaitForGuideButton = (_XInputWaitForGuideButton)::GetProcAddress(hModule, (LPCSTR)101);
    _XInputCancelGuideButtonWait XInputCancelGuideButtonWait = (_XInputCancelGuideButtonWait)::GetProcAddress(hModule, (LPCSTR)102);
    _XInputPowerOffController XInputPowerOffController = (_XInputPowerOffController)::GetProcAddress(hModule, (LPCSTR)103);

    if (nullptr == XInputGetStateEx)
    {
        XInputGetStateEx = (_XInputGetStateEx)::GetProcAddress(hModule, "XInputGetState");
    }

    while (XInputGetStateEx)
    {
        XINPUT_STATE state = { 0 };
        XInputGetStateEx(0, &state);

        LogPrintf(_T("LeftTrigger: %3d RightTrigger: %3d LeftThumb: %6d,%6d RightThumb: %6d,%6d Button: %04X\r\n"),
            state.Gamepad.bLeftTrigger, state.Gamepad.bRightTrigger,
            state.Gamepad.sThumbLX, state.Gamepad.sThumbLY,
            state.Gamepad.sThumbRX, state.Gamepad.sThumbRY,
            state.Gamepad.wButtons
        );

        ::Sleep(10);
    }

    ::FreeLibrary(hModule);

    return 0;
}

void LogPrintf(LPCTSTR pFormat, ...)
{
    size_t nCchCount = MAX_PATH;
    _tstring strResult(nCchCount, 0);
    va_list args;

    va_start(args, pFormat);

    do
    {
        //格式化输出字符串
        int nSize = _vsntprintf_s(&strResult[0], nCchCount, _TRUNCATE, pFormat, args);
        if (-1 != nSize)
        {
            HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
            ::WriteConsole(console, strResult.c_str(), nSize, NULL, NULL);
            break;
        }

        //缓冲大小超限终止
        if (nCchCount >= INT32_MAX)
        {
            break;
        }

        //重新分配缓冲
        nCchCount *= 2;
        strResult.resize(nCchCount);

    } while (true);

    va_end(args);
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值