与“系统级”媒体播放器互动

时间:2015-07-16 20:53:08

标签: c# windows microsoft-metro media-player windows-10

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

screen shot

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

3 个答案:

答案 0 :(得分:5)

您需要使用SystemMediaTransportControls

以下是播放和暂停的基本设置。如果您想启用更多控件,可以使用ex的可用属性。

systemControls.IsNextEnabled = true;

,您必须在按钮开关中添加case

case SystemMediaTransportControlsButton.Next:
                    //handle next song
                    break;

XAML

<MediaElement x:Name="mediaElement" Height="100" Width="100" AreTransportControlsEnabled="True"/>

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();
    });
}

输出

Output

此外,如果您希望所有这些在后台运行,则必须在Package.appxmanifest中为后台任务执行声明,启用音频并添加类似TestUWP.MainPage的入口点

enter image description here

答案 1 :(得分:4)

即使@Stamos已经有一个很好的答案,我也会在此添加我的输入,因为我发现实际上可以使用来自SystemMediaTransportControls的{​​{1}}本机Windows应用程序(不仅是通用应用程序)。

首先,它仍然需要引用通用winmd文件,因此它只适用于Win10。它们将位于10个sdk中,您可以通过常规Add Reference -> Browse添加它们,但您可能需要将对话框右下角的过滤器更改为&#34;所有文件&#34;让他们出现。它们可以在我的电脑上找到:

  • 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();访问传输控件(它会抛出异常),因为您没有&#39 ; t实际上有一个普遍的看法。使用以下内容可以缓解这种情况:

SystemMediaTransportControls systemControls =
    BackgroundMediaPlayer.Current.SystemMediaTransportControls;

在此之后,您可以随意在线使用任何样品或Stamos&#39;答案。

答案 2 :(得分:-1)

<MediaElement x:Name="Media"
              AreTransportControlsEnabled="True">
    <MediaElement.TransportControls>
        <MediaTransportControls 
            Style="{StaticResource MediaTCStyle}"/>
    </MediaElement.TransportControls>
</MediaElement>

风格很大,所以我附上一个链接 MediaTransportControls styles and templates 我从文章(上面的链接)中获得了样式,并在我自己的ResourceDictionary中修改了它。