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

使用GSMTCSM遇API访问及权限拒绝问题求助

解决方案

一、控制台应用启用Windows.Media API访问

  1. 调整项目TargetFramework
    打开项目文件(.csproj),将TargetFramework修改为带Windows版本的TFM(以Windows 10 20H2及以上版本为例):

    <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
    

    同时添加启用Windows Runtime支持的属性:

    <EnableWindowsRuntimeSupport>true</EnableWindowsRuntimeSupport>
    
  2. 安装匹配版本的SDK.Contracts
    卸载现有Microsoft.Windows.SDK.Contracts包,安装与TargetFramework版本对应的包。比如针对Windows 10 19041,安装10.0.19041.1版本,可通过NuGet包管理器或以下命令完成:

    Install-Package Microsoft.Windows.SDK.Contracts -Version 10.0.19041.1
    

    完成后即可在控制台项目中正常引用Windows.Media.Control命名空间。

二、UWP应用解决UnauthorizedAccessException

  1. 添加受限能力声明
    打开Package.appxmanifest,先在根元素添加rescap命名空间:

    <Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
             xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
             IgnorableNamespaces="uap mp rescap">
    

    再在<Capabilities>节点下添加全局媒体控制的受限能力:

    <Capabilities>
      <rescap:Capability Name="globalMediaControl" />
      <!-- 保留已添加的musicLibrary等权限 -->
    </Capabilities>
    
  2. 改用异步调用方式
    避免使用.Wait()阻塞线程,改用await异步调用:

    var manager = await GlobalSystemMediaTransportControlsSessionManager.RequestAsync();
    

三、非UWP实现完整示例(控制台)

以下是读取音频会话信息、控制播放的可运行代码:

using Windows.Media.Control;

class Program
{
    static async Task Main(string[] args)
    {
        // 获取会话管理器
        var sessionManager = await GlobalSystemMediaTransportControlsSessionManager.RequestAsync();
        // 监听会话切换事件
        sessionManager.SessionChanged += SessionManager_SessionChanged;

        // 获取当前活跃会话并过滤浏览器
        var activeSession = sessionManager.GetCurrentSession();
        if (activeSession != null && !IsBrowserSession(activeSession))
        {
            await PrintSessionDetails(activeSession);
            // 示例:执行暂停操作
            await activeSession.TryPauseAsync();
        }

        Console.WriteLine("按任意键退出...");
        Console.ReadKey();
    }

    // 判断是否为浏览器会话
    private static bool IsBrowserSession(GlobalSystemMediaTransportControlsSession session)
    {
        var appId = session.SourceAppUserModelId;
        return appId.Contains("chrome") || appId.Contains("edge") || appId.Contains("firefox");
    }

    // 打印会话媒体信息
    private static async Task PrintSessionDetails(GlobalSystemMediaTransportControlsSession session)
    {
        var mediaProps = await session.TryGetMediaPropertiesAsync();
        if (mediaProps != null)
        {
            Console.WriteLine($"标题: {mediaProps.Title}");
            Console.WriteLine($"艺术家: {mediaProps.Artist}");
            Console.WriteLine($"专辑: {mediaProps.AlbumTitle}");
        }
        Console.WriteLine($"播放状态: {session.GetPlaybackInfo().PlaybackStatus}");
    }

    // 会话切换时触发的逻辑
    private static async void SessionManager_SessionChanged(GlobalSystemMediaTransportControlsSessionManager sender, SessionChangedEventArgs args)
    {
        var newSession = args.Session;
        if (newSession != null && !IsBrowserSession(newSession))
        {
            Console.WriteLine("\n检测到新的活跃音频会话:");
            await PrintSessionDetails(newSession);
        }
    }
}

四、备选方案

如果GSMTCSM配置仍有问题,可使用AudioSwitcher.AudioApi.CoreAudio库枚举音频会话,但该库无法直接获取媒体元数据(标题、艺术家),仍需结合GSMTCSM实现完整功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 06:25:19