You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pygame中获取DualShock 4控制器的电量?

获取DualShock 4控制器电量的解决方案

Pygame的get_power_level()方法仅支持部分控制器,DualShock 4(DS4)不在其适配范围内——这是因为SDL(Pygame依赖的底层库)未针对DS4的自定义HID报告做电量解析。以下是几种可行的替代方案:

1. 直接通过HID接口读取(跨平台)

DS4会通过HID报告主动发送电量数据,你可以使用hidapi库直接读取设备的HID数据包并解析电量:

首先安装依赖:

pip install hidapi

然后使用以下代码读取电量:

import hid

# DS4的标准VID和PID(无线/有线模式通用)
DS4_VID = 0x054C
DS4_PID = 0x09CC

try:
    # 连接DS4设备
    ds4_device = hid.Device(vid=DS4_VID, pid=DS4_PID)
    # 读取64字节的输入报告(DS4的标准报告长度)
    report = ds4_device.read(64)
    
    if report:
        # 电量值位于报告的第31个字节(索引为30),范围0-100
        battery_level = report[30]
        print(f"DS4电量: {battery_level}%")
    ds4_device.close()
except Exception as e:
    print(f"读取失败: {str(e)}")

注意:部分系统可能需要权限才能访问HID设备,比如Linux下需要添加udev规则,Windows下可能需要管理员权限。

2. 系统层面读取(针对特定平台)

Linux

DS4连接后会在/sys/class/power_supply/目录下生成电量文件,直接读取即可:

import glob

def get_ds4_battery():
    battery_paths = glob.glob('/sys/class/power_supply/sony_controller_battery_*/capacity')
    if battery_paths:
        with open(battery_paths[0], 'r') as f:
            return f.read().strip()
    return None

battery = get_ds4_battery()
print(f"DS4电量: {battery}%" if battery else "未检测到DS4控制器")

Windows

可以通过WMI接口读取设备电量,需要安装pywin32库:

pip install pywin32

示例代码:

import win32com.client

def get_ds4_battery():
    wmi = win32com.client.GetObject("winmgmts:")
    # 筛选DS4的电源设备
    for device in wmi.InstancesOf("Win32_Battery"):
        if "DualShock 4" in device.Description:
            return device.EstimatedChargeRemaining
    return None

battery = get_ds4_battery()
print(f"DS4电量: {battery}%" if battery else "未检测到DS4控制器")

macOS

可以使用pyobjc调用系统IOKit框架读取设备信息,安装依赖:

pip install pyobjc

示例代码(核心逻辑):

from Foundation import NSBundle
from IOKit.hid import IO_HIDManagerCreate, IO_HIDManagerSetDeviceMatching, IO_HIDManagerOpen, IO_HIDManagerCopyDevices

def get_ds4_battery():
    hid_manager = IO_HIDManagerCreate(None)
    # 匹配DS4设备
    matching_dict = {"idVendor": 0x054C, "idProduct": 0x09CC}
    IO_HIDManagerSetDeviceMatching(hid_manager, matching_dict)
    IO_HIDManagerOpen(hid_manager, 0)
    devices = IO_HIDManagerCopyDevices(hid_manager)
    
    if devices.count() > 0:
        # 读取HID报告并解析第30字节获取电量(逻辑同跨平台HID方法)
        report = devices[0].read(64)
        battery_level = report[30]
        print(f"DS4电量: {battery_level}%")
    return None

get_ds4_battery()

3. 专用DS4驱动库

使用ds4drv(专门针对DS4的驱动工具),它能提供完整的设备状态信息,包括电量:

安装依赖:

pip install ds4drv

运行ds4drv服务后,可以通过其日志输出解析电量,或者使用其Python API直接获取状态(需参考官方文档)。注意Linux下可能需要root权限或配置udev规则来运行ds4drv。

关于inputs库的报错问题:该库对DS4的识别依赖于系统驱动和权限配置,通常需要安装DS4专用驱动(如Windows下的DS4Windows)或调整系统权限才能正常识别。

内容的提问来源于stack exchange,提问作者FrostDream

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:33:32