#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);
}
Win32 C++ Xinput 获取XBOX控制器所有按键(含Guide 西瓜键 按钮)
于 2024-08-28 19:30:49 首次发布