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

如何在Node.js或Rust中使用winrt.windows.media.control获取Windows媒体信息

获取Windows当前播放媒体信息的实现方案

一、Node.js(Electron)实现

通过Node.js调用Windows WinRT API实现,使用winrt-node库直接对接系统媒体控制接口:

步骤1:安装依赖

npm install winrt-node

步骤2:实现代码

const { MediaManager } = require('winrt-node').Windows.Media.Control;

async function getCurrentMediaInfo() {
  const sessions = await MediaManager.requestAsync();
  const currentSession = sessions.getCurrentSession();
  if (currentSession) {
    const info = await currentSession.tryGetMediaPropertiesAsync();
    return {
      title: info.title,
      artist: info.artist,
      album: info.albumTitle,
      // 缩略图为流对象,需额外处理才能转为可展示的图片格式
      thumbnailStream: info.thumbnail
    };
  }
  return null;
}

// 调用示例
getCurrentMediaInfo().then(info => {
  if (info) {
    console.log(`当前播放:${info.title} - ${info.artist}`);
  } else {
    console.log("当前无媒体播放");
  }
}).catch(err => console.error(err));

如果在Electron渲染进程中使用,需通过IPC通信将主进程获取到的信息传递到前端页面展示。

二、Rust(Tauri)实现

使用winrt-rs crate对接WinRT媒体API,集成到Tauri应用的后端逻辑中:

步骤1:添加依赖

在src-tauri/Cargo.toml中追加依赖项:

[dependencies]
tauri = { version = "1.5", features = ["api-all"] }
winrt = { version = "0.9", features = ["Windows.Media.Control"] }
tokio = { version = "1.0", features = ["full"] }
serde_json = "1.0"

步骤2:后端实现(src-tauri/src/main.rs)

use tauri::Manager;
use winrt::Windows::Media::Control::{GlobalSystemMediaTransportControlsSessionManager, GlobalSystemMediaTransportControlsSessionMediaProperties};

#[tauri::command]
async fn get_current_media_info() -> Option<serde_json::Value> {
    // 请求媒体会话管理器
    let manager = GlobalSystemMediaTransportControlsSessionManager::request_async().await.ok()?;
    // 获取当前活跃媒体会话
    let current_session = manager.get_current_session()?;
    // 获取媒体属性
    let media_properties = current_session.try_get_media_properties_async().await.ok()?;

    Some(serde_json::json!({
        "title": media_properties.title().ok()?,
        "artist": media_properties.artist().ok()?,
        "album": media_properties.album_title().ok()?,
        "has_thumbnail": media_properties.thumbnail().is_some()
    }))
}

fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![get_current_media_info])
        .run(tauri::generate_context!())
        .expect("启动Tauri应用失败");
}

步骤3:前端调用示例

import { invoke } from '@tauri-apps/api/tauri';

async function refreshMediaInfo() {
  const info = await invoke('get_current_media_info');
  const displayEl = document.getElementById('media-display');
  if (info) {
    displayEl.innerText = `当前播放:${info.title} - ${info.artist}`;
  } else {
    displayEl.innerText = "当前无媒体播放";
  }
}

// 每秒刷新一次媒体信息
setInterval(refreshMediaInfo, 1000);

注意事项

  • 两种方案仅支持Windows 10 1703及以上版本,对应API从该版本开始提供。
  • 缩略图需额外处理:Node.js需将流对象转为Base64或文件;Rust需通过thumbnail().open_read_async()读取流数据后转换格式。

内容的提问来源于stack exchange,提问作者Résu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:01:10