如何在TypeScript/JavaScript及VS Code扩展中调用Windows库函数?
在VS Code扩展中调用Windows媒体控制API及进程检测方案
一、调用Windows.Media.SystemMediaTransportControls的两种方案
1. 直接用TypeScript/JavaScript通过WinRT绑定调用
VS Code扩展基于Electron(Node.js环境),可借助winrt-node库直接调用WinRT API,步骤如下:
- 安装依赖:
npm install winrt-node
- 在扩展主进程中编写代码(
getForCurrentView()需关联UI上下文,可通过Electron创建隐藏窗口实现,或直接在渲染进程调用):
import { Windows } from 'winrt-node'; // 获取系统媒体控制实例 const smtc = Windows.Media.SystemMediaTransportControls.getForCurrentView(); // 监听媒体按钮按下事件 smtc.addEventListener('buttonpressed', (args) => { console.log(`媒体按钮触发: ${args.button}`); }); // 设置播放状态示例 smtc.playbackStatus = Windows.Media.MediaPlaybackStatus.playing;
注意:打包扩展时需确保winrt-node针对Windows平台正确编译,可在package.json中配置平台特定依赖。
2. 用.NET封装后通过npm包调用
你考虑的.NET封装方案完全可行,推荐用edge-js简化Node.js与.NET的交互,无需编写复杂原生扩展:
- 步骤1:创建C#类库封装SMTC功能
using Windows.Media; namespace SMTCWrapper { public class SMTCController { private readonly SystemMediaTransportControls _smtc; public SMTCController() { _smtc = SystemMediaTransportControls.GetForCurrentView(); _smtc.ButtonPressed += OnButtonPressed; } private void OnButtonPressed(SystemMediaTransportControls sender, SystemMediaTransportControlsButtonPressedEventArgs args) { ButtonPressed?.Invoke(args.Button.ToString()); } public delegate void ButtonPressedEventHandler(string button); public event ButtonPressedEventHandler ButtonPressed; public void SetPlaybackStatus(string status) { _smtc.PlaybackStatus = status switch { "playing" => MediaPlaybackStatus.Playing, "paused" => MediaPlaybackStatus.Paused, _ => MediaPlaybackStatus.Stopped }; } } }
- 步骤2:在Node.js中通过
edge-js调用
安装依赖:
npm install edge-js
编写TS/JS代码:
const edge = require('edge-js'); // 加载.NET类 const createSMTCController = edge.func(` using SMTCWrapper; return (Func<object, SMTCController>)(input => new SMTCController()); `); const controller = createSMTCController(); // 监听按钮事件 controller.ButtonPressed((button: string) => { console.log(`媒体按钮按下: ${button}`); }); // 设置播放状态 controller.SetPlaybackStatus('playing');
二、检测本地进程(类似Discord网页版的功能)
Discord网页版主要通过自定义协议唤起客户端,若要直接检测进程是否存在,可通过以下两种方式实现:
1. 使用第三方进程列表库
安装ps-list跨平台库:
npm install ps-list
编写检测代码:
import psList from 'ps-list'; async function isProcessRunning(processName: string): Promise<boolean> { const processes = await psList(); return processes.some(p => p.name.toLowerCase() === processName.toLowerCase()); } // 检测Discord是否运行 isProcessRunning('Discord.exe').then(exists => { console.log(`Discord运行状态: ${exists}`); });
2. 直接调用Windows系统命令
无需额外依赖,通过tasklist命令检测:
import { exec } from 'child_process'; function checkProcessStatus(processName: string, callback: (exists: boolean) => void): void { exec(`tasklist /FI "IMAGENAME eq ${processName}"`, (err, stdout) => { callback(!err && stdout.includes(processName)); }); } // 检测VS Code是否运行 checkProcessStatus('Code.exe', (exists) => { console.log(`VS Code运行状态: ${exists}`); });
内容的提问来源于stack exchange,提问作者ninetynin
相关产品推荐
相关产品推荐

