使用SystemMediaTransportControls从其他应用程序获取当前播放的歌曲信息

问题描述 投票:0回答:3

我编写了一个程序,它应该与另一个播放器一起工作并检索有关当前播放歌曲的信息。该播放器是使用 UWP 编写的,因此 Windows 知道正在播放什么曲目,因此我可以在更改音量时看到它的名称和其他信息:

https://i.stack.imgur.com/WSmwh.png

我尝试过的事情:

var systemMediaControls = SystemMediaTransportControls.GetForCurrentView();

来自 从 Microsoft Groove 音乐应用程序获取当前播放的曲目信息

不幸的是,据我了解,这仅适用于本地媒体,从我的应用程序播放。

由于同样的原因,后台媒体播放器也没有帮助。

是否可以从 Windows 获取它?或者我应该直接读取那个玩家的记忆,呵呵?

c# windows uwp system
3个回答
13
投票

如何显示艺术家和歌曲名称:

如果您不开发 WinRT 应用程序,请获取 Microsoft.Windows.SDK.Contracts 包。

(Visual Studio) 在 NuGet 包管理器设置(工具->NuGet 包管理器->包管理器设置)中,您需要将“PackageManagement\Default 包管理格式”设置为“PackageReference”

如果您已经这样做了,该包应该会显示在您的参考文献中。如果不是这种情况,您需要卸载该软件包及其依赖项,然后重试。

这是示例代码:

using System;
using System.Threading.Tasks;
using Windows.Media.Control;

public static class Program {
    public static async Task Main(string[] args) {
        var gsmtcsm = await GetSystemMediaTransportControlsSessionManager();
        var mediaProperties = await GetMediaProperties(gsmtcsm.GetCurrentSession());

        Console.WriteLine("{0} - {1}", mediaProperties.Artist, mediaProperties.Title);

        Console.WriteLine("Press any key to quit..");
        Console.ReadKey(true);
    }

    private static async Task<GlobalSystemMediaTransportControlsSessionManager> GetSystemMediaTransportControlsSessionManager() =>
        await GlobalSystemMediaTransportControlsSessionManager.RequestAsync();

    private static async Task<GlobalSystemMediaTransportControlsSessionMediaProperties> GetMediaProperties(GlobalSystemMediaTransportControlsSession session) =>
        await session.TryGetMediaPropertiesAsync();
}

0
投票

音乐应用程序显示的屏幕控制栏不受系统控制,属于应用程序本身。

您无法在其他音乐软件中播放音乐,就像您无法从其他应用程序的应用程序文件夹中获取文件一样。

无论如何,如果你只是想从操作系统获取当前歌曲,没有这样的API。

致以诚挚的问候。


0
投票

我需要类似的东西(从Spotify等应用程序或任何其他利用SystemMediaTransportControls的媒体播放器获取当前播放的媒体并找到它的方法。 根据此链接: https://learn.microsoft.com/en-us/windows/apps/desktop/modernize/desktop-to-uwp-enhance 如果您使用.net 6或更高版本,您需要将目标pltform设置为windows10.0.17763.0或仅修改您的项目文件:

<TargetFramework>net7.0-windows10.0.17763.0</TargetFramework>

如果您使用 .NET Framework 4.6+ 或 .NET Core 3.0+,则必须安装

Microsoft.Windows.SDK.Contracts
nuget 包。 然后你可以添加
using Windows.Media.Control;

这里有一个示例代码(写得不是很好,但你可以看到如何使用 API),它显示当前正在播放的媒体(还利用事件来显示新媒体和媒体播放状态)

using System;
using System.Security.Cryptography;
using System.Threading.Tasks;
using Windows.Media.Control;

namespace TestGetCurrentMedia
{
   internal class Program
   {
      public static async Task Main(string[] args)
      {
         var gsmtcsm = await GetSystemMediaTransportControlsSessionManager();
         Gsmtcsm_CurrentSessionChanged(gsmtcsm, null);
         gsmtcsm.CurrentSessionChanged += Gsmtcsm_CurrentSessionChanged;
         Console.ReadLine();
      }
      static string LastString = "";
      private static async void Gsmtcsm_CurrentSessionChanged(GlobalSystemMediaTransportControlsSessionManager sender, CurrentSessionChangedEventArgs args)
      {
         var s = sender.GetCurrentSession();
         if (s != null)
         {
            s.MediaPropertiesChanged += S_MediaPropertiesChanged;
            S_MediaPropertiesChanged(s, null);
            s.PlaybackInfoChanged += S_PlaybackInfoChanged;
            S_PlaybackInfoChanged(s, null);
         }
         //GC.Collect();
      }

      private static void S_PlaybackInfoChanged(GlobalSystemMediaTransportControlsSession sender, PlaybackInfoChangedEventArgs args)
      {
         GlobalSystemMediaTransportControlsSessionPlaybackInfo playbackInfo = sender.GetPlaybackInfo();
         Console.WriteLine(LastString + " => " + playbackInfo.PlaybackStatus);
      }

      private static async void S_MediaPropertiesChanged(GlobalSystemMediaTransportControlsSession sender, MediaPropertiesChangedEventArgs args)
      {
         GlobalSystemMediaTransportControlsSessionMediaProperties mediaProperties = await sender.TryGetMediaPropertiesAsync();
         if (mediaProperties != null)
         {
            string Curr = ($"{mediaProperties.Artist} - {mediaProperties.Title} - {mediaProperties.TrackNumber}");
            if (!Curr.Equals(LastString))
            {
               //Console.WriteLine(Curr);
               LastString = Curr;
               S_PlaybackInfoChanged(sender, null);
            }
         }
      }
      private static async Task<GlobalSystemMediaTransportControlsSessionManager> GetSystemMediaTransportControlsSessionManager() =>
          await GlobalSystemMediaTransportControlsSessionManager.RequestAsync();
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.