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

UWP中如何通过Windows.Gaming.Input读取罗技Extreme 3D Pro飞行摇杆输入并显示按键?

嘿,我刚好折腾过用Windows.Gaming.Input处理飞行摇杆的需求,针对你用Logitech Extreme 3D Pro读取按键的问题,我来给你拆解下可行的实现步骤和代码调整建议——毕竟Xbox控制器的逻辑和飞行摇杆还是有细微差别的,直接套用容易踩坑。

实现方案拆解

1. 设备检测与初始化

首先,飞行摇杆的枚举和Xbox控制器类似,但要专门用FlightStick类来处理。你需要监听设备的连接/断开事件,确保能捕获到Log摇杆的状态变化:

  • 注册FlightStick.FlightStickAdded事件,当摇杆连接时获取设备实例
  • 注册FlightStick.FlightStickRemoved事件,处理设备断开的情况
  • 也可以直接通过FlightStick.FlightSticks集合获取已连接的摇杆

2. 读取按键输入

飞行摇杆的按键对应FlightStickButtons枚举,Logitech Extreme 3D Pro的所有实体按键都能映射到这个枚举里(比如扳机键、拇指摇杆按键、侧面的12个功能键等)。你可以通过FlightStick.GetCurrentReading()方法获取实时的输入状态,然后判断哪些按键被按下。

3. 完整代码示例

这里给你调整后的MainPage代码,包含设备监听和按键读取的核心逻辑:

public sealed partial class MainPage : Page
{
    private FlightStick _currentJoystick;
    private DispatcherTimer _inputTimer;

    public MainPage()
    {
        this.InitializeComponent();
        
        // 初始化设备监听
        FlightStick.FlightStickAdded += FlightStick_FlightStickAdded;
        FlightStick.FlightStickRemoved += FlightStick_FlightStickRemoved;
        
        // 检查是否已有连接的摇杆
        if (FlightStick.FlightSticks.Count > 0)
        {
            _currentJoystick = FlightStick.FlightSticks[0];
        }
        
        // 创建定时器定时读取输入(比如每16ms读取一次,接近60帧)
        _inputTimer = new DispatcherTimer();
        _inputTimer.Interval = TimeSpan.FromMilliseconds(16);
        _inputTimer.Tick += InputTimer_Tick;
        _inputTimer.Start();
    }

    private void FlightStick_FlightStickAdded(object sender, FlightStick e)
    {
        // 优先使用新连接的摇杆,或者根据需求选择特定设备
        _currentJoystick = e;
        Debug.WriteLine("摇杆已连接");
    }

    private void FlightStick_FlightStickRemoved(object sender, FlightStick e)
    {
        if (_currentJoystick == e)
        {
            _currentJoystick = null;
            Debug.WriteLine("摇杆已断开");
        }
    }

    private void InputTimer_Tick(object sender, object e)
    {
        if (_currentJoystick == null)
        {
            // 没有连接的摇杆时更新UI提示
            StatusTextBlock.Text = "未检测到飞行摇杆";
            return;
        }

        // 获取当前输入读取值
        var reading = _currentJoystick.GetCurrentReading();
        
        // 收集所有按下的按键
        var pressedButtons = new List<string>();
        if ((reading.Buttons & FlightStickButtons.Trigger) != 0)
        {
            pressedButtons.Add("扳机键");
        }
        if ((reading.Buttons & FlightStickButtons.ThumbstickButton) != 0)
        {
            pressedButtons.Add("拇指摇杆按键");
        }
        // 检查1-12号功能键
        for (int i = 1; i <= 12; i++)
        {
            var button = (FlightStickButtons)Enum.Parse(typeof(FlightStickButtons), $"Button{i}");
            if ((reading.Buttons & button) != 0)
            {
                pressedButtons.Add($"功能键{i}");
            }
        }

        // 更新UI显示按下的按键
        if (pressedButtons.Count > 0)
        {
            StatusTextBlock.Text = $"当前按下的按键:{string.Join(", ", pressedButtons)}";
        }
        else
        {
            StatusTextBlock.Text = "无按键按下";
        }
    }

    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        // 页面离开时清理资源
        _inputTimer.Stop();
        FlightStick.FlightStickAdded -= FlightStick_FlightStickAdded;
        FlightStick.FlightStickRemoved -= FlightStick_FlightStickRemoved;
        base.OnNavigatedFrom(e);
    }
}

4. 关键注意事项

  • 权限声明:需要在Package.appxmanifest里添加游戏输入设备的权限,否则可能无法检测到摇杆。在清单的Capabilities节点下添加:
    <DeviceCapability Name="gameInput" />
    
  • 设备兼容性:Logitech Extreme 3D Pro是标准的HID飞行摇杆,Windows.Gaming.Input完全支持,但如果遇到识别问题,可以尝试更新罗技的驱动。
  • 输入读取频率:用定时器读取是比较简单的方式,也可以用游戏循环(比如在UWP的CoreWindow事件里处理),根据你的应用场景选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:24:42