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
相关产品推荐
相关产品推荐

