与"系统级"媒体播放器互动

squ*_*l25 7 c# windows media-player microsoft-metro windows-10

我想开发一个适用于Windows 10的音乐应用程序,我对卷条旁边的Groove Music提供的界面感到好奇.我已经尝试使用Google搜索来获取更多相关信息,但我没有取得任何成功.当我在Groove Music中播放音乐并且我提高或降低音量时,当前歌曲的名称以及艺术家和专辑封面显示音量控制器旁边的音量控制器:

屏幕截图

我想知道如何在我自己的应用程序中创建此对话框以及我需要查看的Windows API.

cae*_*say 8

即使@Stamos已经提供了一个很好的答案,我还是要为此添加我的输入,因为我发现实际上可以SystemMediaTransportControls从本机 Windows 应用程序(不仅是通用应用程序)中使用它。

首先,它仍然需要对通用winmd文件的引用,因此它只能在 Win10 上运行。它们将位于 10 sdk 中,您可以通过常规添加它们,Add Reference -> Browse但您可能需要将对话框右下角的过滤器更改为“所有文件”才能显示它们。它们可以在我的 PC 上找到:

  • Windows.Foundation.UniversalApiContract:
    C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.UniversalApiContract\1.0.0.0\Windows.Foundation.UniversalApiContract.winmd
  • Windows.Foundation.FoundationContract:
    C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.FoundationContract\2.0.0.0\Windows.Foundation.FoundationContract.winmd

获得必要的引用后,您将遇到另一个问题 - 您无法通过通常的方式访问传输控件SystemMediaTransportControls.GetForCurrentView();(它会引发异常),因为您实际上没有通用视图。使用以下方法可以缓解这种情况:

SystemMediaTransportControls systemControls =
    BackgroundMediaPlayer.Current.SystemMediaTransportControls;
Run Code Online (Sandbox Code Playgroud)

在此之后,您可以随意使用任何在线示例或 Stamos 的答案。


Sta*_*mos 5

您需要使用SystemMediaTransportControls

这是Play和Pause的基本设置.如果您想启用更多控件,可以使用ex的可用属性.

systemControls.IsNextEnabled = true;

你必须case在按钮开关中添加.

case SystemMediaTransportControlsButton.Next:
                    //handle next song
                    break;
Run Code Online (Sandbox Code Playgroud)

XAML

<MediaElement x:Name="mediaElement" Height="100" Width="100" AreTransportControlsEnabled="True"/>
Run Code Online (Sandbox Code Playgroud)

C#

public MainPage()
{
    this.InitializeComponent();

    systemControls = SystemMediaTransportControls.GetForCurrentView();

    // Register to handle the following system transpot control buttons.
    systemControls.ButtonPressed += SystemControls_ButtonPressed;

    mediaElement.CurrentStateChanged += MediaElement_CurrentStateChanged;


    systemControls.IsPlayEnabled = true;
    systemControls.IsPauseEnabled = true;
}

private void MediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    switch (mediaElement.CurrentState)
    {
        case MediaElementState.Playing:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Playing;
            break;
        case MediaElementState.Paused:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Paused;
            break;
        case MediaElementState.Stopped:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
            break;
        case MediaElementState.Closed:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Closed;
            break;
        default:
            break;
    }
}



void SystemControls_ButtonPressed(SystemMediaTransportControls sender, SystemMediaTransportControlsButtonPressedEventArgs args)
{
    switch (args.Button)
    {
        case SystemMediaTransportControlsButton.Play:
            PlayMedia();
            break;
        case SystemMediaTransportControlsButton.Pause:
            PauseMedia();
            break;
        case SystemMediaTransportControlsButton.Stop:
            StopMedia();
            break;
        default:
            break;
    }
}

private async void StopMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        mediaElement.Stop();
    });
}

async void PlayMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        if (mediaElement.CurrentState == MediaElementState.Playing)
            mediaElement.Pause();
        else
            mediaElement.Play();
    });
}

async void PauseMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        mediaElement.Pause();
    });
}
Run Code Online (Sandbox Code Playgroud)

产量

产量

此外,如果您希望所有这些在后台工作,您将不得不Package.appxmanifest为后台任务执行声明,启用音频并添加一个入口点,如TestUWP.MainPage

在此输入图像描述


Dan*_*pov -1

<MediaElement x:Name="Media"
              AreTransportControlsEnabled="True">
    <MediaElement.TransportControls>
        <MediaTransportControls 
            Style="{StaticResource MediaTCStyle}"/>
    </MediaElement.TransportControls>
</MediaElement>
Run Code Online (Sandbox Code Playgroud)

该样式相当大,因此我附加了一个链接 MediaTransportControls 样式和模板 我从文章(上面的链接)中获取了样式,并在我自己的 ResourceDictionary 中对其进行了修改。