利用VS和windows api获取Xbox手柄按键摇杆全部信息

如何利用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;
}

4.最终运行结果

在这里插入图片描述

完!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值