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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:05:41