如何在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
相关产品推荐
相关产品推荐

