我编写了一个程序,它应该与另一个播放器一起工作并检索有关当前播放歌曲的信息。该播放器是使用 UWP 编写的,因此 Windows 知道正在播放什么曲目,因此我可以在更改音量时看到它的名称和其他信息:
我尝试过的事情:
var systemMediaControls = SystemMediaTransportControls.GetForCurrentView();
来自 从 Microsoft Groove 音乐应用程序获取当前播放的曲目信息
不幸的是,据我了解,这仅适用于本地媒体,从我的应用程序播放。
由于同样的原因,后台媒体播放器也没有帮助。
是否可以从 Windows 获取它?或者我应该直接读取那个玩家的记忆,呵呵?
如何显示艺术家和歌曲名称:
如果您不开发 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();
}
音乐应用程序显示的屏幕控制栏不受系统控制,属于应用程序本身。
您无法在其他音乐软件中播放音乐,就像您无法从其他应用程序的应用程序文件夹中获取文件一样。
无论如何,如果你只是想从操作系统获取当前歌曲,没有这样的API。
致以诚挚的问候。
我需要类似的东西(从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();
}
}