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

解决Xbox手柄B键触发UWP应用挂起,实现WebView返回导航

解决UWP WebView Xbox手柄B键返回问题

核心问题分析

你遇到的问题根源在于:Xbox手柄B键的系统默认返回主页行为优先级高于自定义的WebView导航逻辑,同时你的代码存在两处关键遗漏:未阻止系统默认动作、WebView实例未正确绑定。

修复步骤

  1. 给WebView添加命名引用
    修改MainPage.xaml代码,为WebView添加x:Name属性,确保后台代码能正确引用到WebView实例:

    <WebView x:Name="source" Source="https://luser.github.io/gamepadtest/">
    </WebView>
    
  2. 阻止B键的系统默认行为
    在CoreWindow_KeyDown方法中处理完WebView返回逻辑后,必须设置args.Handled = true,否则系统会继续执行B键的默认返回主页动作:

    private void CoreWindow_KeyDown(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.KeyEventArgs args)
    {
        if(args.VirtualKey == Windows.System.VirtualKey.GamepadB)
        {
            if(source.CanGoBack)
            {
                source.GoBack();
            }
            // 强制阻止系统处理B键的默认行为
            args.Handled = true;
        }
    }
    
  3. 确保gamepadInputEmulation设置生效
    需在WebView加载的页面中正确启用键盘模拟,可通过两种方式实现:

    • 网页端脚本设置
      在目标页面的<script>标签中添加:
      if (window.navigation) {
          window.navigation.gamepadInputEmulation = 'keyboard';
      }
      
    • UWP端代码注入设置
      修改XAML中的WebView标签,添加NavigationCompleted事件:
      <WebView x:Name="source" Source="https://luser.github.io/gamepadtest/" 
               NavigationCompleted="source_NavigationCompleted">
      </WebView>
      
      后台实现事件逻辑:
      private async void source_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args)
      {
          if (args.IsSuccess)
          {
              await source.InvokeScriptAsync("eval", new[] { "window.navigation.gamepadInputEmulation = 'keyboard';" });
          }
      }
      

额外优化建议

  • 若WebView因焦点丢失导致KeyDown事件未触发,可在OnNavigatedTo中强制让WebView获取焦点:
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;
        source.Focus(FocusState.Programmatic);
    }
    
  • 当WebView无历史页面可返回时,可让B键触发UWP应用内页面返回逻辑:
    if(source.CanGoBack)
    {
        source.GoBack();
    }
    else
    {
        if (Frame.CanGoBack)
        {
            Frame.GoBack();
        }
    }
    args.Handled = true;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:57:46