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

.NET MAUI Windows应用键盘按键检测实现咨询

在Windows平台的.NET MAUI应用中实现全局按键监听与音效播放

核心思路

.NET MAUI 默认键盘事件需要控件获得焦点,而你的应用无输入控件,因此需借助Windows平台原生窗口的键盘事件,实现应用激活状态下的按键检测,搭配MediaPlayer完成音效播放。

实现步骤

1. 界面布局(MainPage.xaml)

添加文件选择按钮用于上传音效:

<VerticalStackLayout Padding="20" Spacing="10">
    <Button Text="选择自定义音效" Clicked="SelectSoundFile_Clicked" />
    <Label x:Name="StatusLabel" Text="未选择音效文件" />
</VerticalStackLayout>

2. 后台逻辑(MainPage.xaml.cs)

引入必要命名空间并实现功能:

using Microsoft.Maui.Controls;
using Microsoft.Maui.Storage;
using Windows.Media.Playback;
using Windows.UI.Core;
using Windows.UI.Xaml;

namespace KeyCap_Sounds;

public partial class MainPage : ContentPage
{
    private string _soundFilePath;
    private MediaPlayer _mediaPlayer;
    private Windows.Media.Core.MediaSource _soundSource;

    public MainPage()
    {
        InitializeComponent();
        _mediaPlayer = new MediaPlayer();
        Loaded += OnMainPageLoaded;
    }

    // 页面加载时注册窗口键盘事件
    private void OnMainPageLoaded(object sender, EventArgs e)
    {
#if WINDOWS
        var currentWindow = Microsoft.Maui.ApplicationModel.Platform.Current.Windows.FirstOrDefault();
        currentWindow?.CoreWindow.KeyDown += CoreWindow_KeyDown;
#endif
    }

    // 按键按下触发音效播放
    private void CoreWindow_KeyDown(CoreWindow sender, KeyEventArgs args)
    {
        if (_soundSource == null) return;

        // 避免重复播放(可选)
        if (_mediaPlayer.PlaybackSession.PlaybackState != MediaPlaybackState.Playing)
        {
            _mediaPlayer.Source = _soundSource;
            _mediaPlayer.Play();
        }
    }

    // 选择音效文件
    private async void SelectSoundFile_Clicked(object sender, EventArgs e)
    {
        var pickResult = await FilePicker.Default.PickAsync(new PickOptions
        {
            Title = "选择音效文件",
            FileTypes = new FilePickerFileType(new Dictionary<DevicePlatform, IEnumerable<string>>
            {
                { DevicePlatform.Windows, new[] { ".wav", ".mp3", ".ogg" } }
            })
        });

        if (pickResult != null)
        {
            _soundFilePath = pickResult.FullPath;
            _soundSource = Windows.Media.Core.MediaSource.CreateFromUri(new Uri(_soundFilePath));
            StatusLabel.Text = $"已选择: {pickResult.FileName}";
        }
    }
}

关键说明

  • 平台适配:用#if WINDOWS条件编译确保代码仅在Windows平台生效,符合MAUI跨平台规范。
  • 按键监听范围:此方案监听当前应用激活窗口的按键事件,若需要窗口未激活时也能监听,需使用Win32全局钩子(需管理员权限,易被安全软件拦截,不推荐常规场景使用)。
  • 音效优化:缓存MediaSource避免每次按键重新加载文件,提升播放响应速度;添加播放状态判断可防止按住按键时重复触发播放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:38:20