如何利用VS和windows api获取Xbox手柄按键摇杆全部信息
1.配置环境
1.1安装 Visual Studio
Microsoft 提供的 Visual Studio(VS)是 Windows 平台上最常用的开发工具。你需要安装 Visual Studio,并选择合适的组件。
- 下载 Visual Studio
访问 Visual Studio 官网
下载 Visual Studio Community 版本(免费) 或更高版本
安装 Visual Studio
- 运行下载的安装程序
在 “工作负载” 选择界面,勾选:
C++ 版本
✅ 使用 C++ 的桌面开发
✅ Windows 10/11 SDK(包含 Windows API)
C# 版本
✅ .NET 桌面开发(包含 C#、.NET 运行时)
点击 “安装”,等待安装完成
1.2 安装 Windows SDK
Windows SDK(软件开发工具包)包含 Windows API,你可以用它来访问 Xbox 手柄的数据。
- 检查是否已安装
如果你在安装 Visual Studio 时选择了 Windows SDK,那么它已经安装好了,可以跳过此步。
如果没有安装,你可以手动下载。 - 手动安装 Windows SDK
访问 Windows SDK 下载页面
下载最新版 Windows 11 SDK
运行安装程序,勾选 Windows App SDK
安装完成后,重启计算机
1.3验证开发环境
安装完成后,你可以验证是否成功配置了开发环境。
- 检查 Windows SDK
按 Win + R,输入 cmd,回车
输入以下命令:
sh
winver
如果 Windows 版本显示 Windows 11,则可以使用 Windows SDK 进行开发。
- 检查 Windows SDK 版本:
sh
reg query "HKLM\SOFTWARE\Microsoft\Windows Kits\Installed Roots"
如果显示 KitsRoot10,并带有 C:\Program Files (x86)\Windows Kits\10 这样的路径,说明 Windows SDK 已正确安装。
- 测试 Visual Studio
- 打开 Visual Studio
- 创建一个新项目
C++ 测试
选择 “Windows 桌面应用(控制台)”
编写 #include <windows.h> 代码,看看是否报错
C# 测试
选择 “.NET 控制台应用”
编写 using System; 代码,看看是否报错 - 运行程序,确保 Visual Studio 工作正常
2.创建并验证工程
2.1 创建工程
- 选择 C++ 控制台应用
在搜索栏输入 C++
选择 “控制台应用”(Console App,使用 C++)
点击 “下一步”
2.2编写测试代码
在 main.cpp 中替换默认代码,输入以下代码:
#include <iostream>
int main() {
std::cout << "Windows SDK is working!" << std::endl;
return 0;
}
2.3测试
- 点击 “Ctrl + F5” 运行程序(无需调试
- 如果终端窗口显示:
csharp
Windows SDK is working!
说明 Windows SDK 已正确安装,并且你的 C++ 开发环境正常。
3.具体实现代码以及注释解读
本案例获取了XBox手柄所有按键和扳机等的状态
#include <windows.h> // Windows API 头文件
#include <Xinput.h> // Xbox 手柄 API
#include <iostream> // C++ 标准输入输出
#pragma comment(lib, "Xinput.lib") // 自动链接 Xinput 库
// 显示 Xbox 手柄的所有状态信息
void GetControllerState(int controllerId) {
XINPUT_STATE state; // 用于存储手柄状态
ZeroMemory(&state, sizeof(XINPUT_STATE)); // 清空数据,防止旧数据影响
DWORD dwResult = XInputGetState(controllerId, &state); // 获取手柄状态
if (dwResult == ERROR_SUCCESS) { // 手柄已连接
std::cout << "\n🎮 Controller " << controllerId << " is connected." << std::endl;
// 读取按键状态
WORD buttons = state.Gamepad.wButtons;
if (buttons & XINPUT_GAMEPAD_A) std::cout << " A Button is pressed." << std::endl;
if (buttons & XINPUT_GAMEPAD_B) std::cout << " B Button is pressed." << std::endl;
if (buttons & XINPUT_GAMEPAD_X) std::cout << " X Button is pressed." << std::endl;
if (buttons & XINPUT_GAMEPAD_Y) std::cout << " Y Button is pressed." << std::endl;
if (buttons & XINPUT_GAMEPAD_START) std::cout << " Start Button is pressed." << std::endl;
if (buttons & XINPUT_GAMEPAD_BACK) std::cout << " Back Button is pressed." << std::endl;
if (buttons & XINPUT_GAMEPAD_LEFT_SHOULDER) std::cout << " Left Shoulder (LB) is pressed." << std::endl;
if (buttons & XINPUT_GAMEPAD_RIGHT_SHOULDER) std::cout << " Right Shoulder (RB) is pressed." << std::endl;
if (buttons & XINPUT_GAMEPAD_LEFT_THUMB) std::cout << " Left Thumbstick Click is pressed." << std::endl;
if (buttons & XINPUT_GAMEPAD_RIGHT_THUMB) std::cout << " Right Thumbstick Click is pressed." << std::endl;
if (buttons & XINPUT_GAMEPAD_DPAD_UP) std::cout << " D-Pad Up is pressed." << std::endl;
if (buttons & XINPUT_GAMEPAD_DPAD_DOWN) std::cout << " D-Pad Down is pressed." << std::endl;
if (buttons & XINPUT_GAMEPAD_DPAD_LEFT) std::cout << " D-Pad Left is pressed." << std::endl;
if (buttons & XINPUT_GAMEPAD_DPAD_RIGHT) std::cout << " D-Pad Right is pressed." << std::endl;
// 读取摇杆数据(范围:-32768 ~ 32767)
std::cout << " Left Thumbstick X: " << state.Gamepad.sThumbLX << std::endl;
std::cout << " Left Thumbstick Y: " << state.Gamepad.sThumbLY << std::endl;
std::cout << " Right Thumbstick X: " << state.Gamepad.sThumbRX << std::endl;
std::cout << " Right Thumbstick Y: " << state.Gamepad.sThumbRY << std::endl;
// 读取扳机(LT 和 RT,范围:0 ~ 255)
std::cout << " Left Trigger (LT): " << (int)state.Gamepad.bLeftTrigger << std::endl;
std::cout << " Right Trigger (RT): " << (int)state.Gamepad.bRightTrigger << std::endl;
}
else {
std::cout << "❌ Controller " << controllerId << " is not connected." << std::endl;
}
}
int main() {
while (true) {
system("cls"); // 清屏,避免信息重复堆积
for (int i = 0; i < 4; ++i) {
GetControllerState(i);
}
Sleep(100); // 每 100ms 刷新一次状态
}
return 0;
}