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

如何判断VS Code扩展是否被用户选中(处于焦点)?

判断VS Code扩展视图的激活状态以控制后台任务

要实现当用户未选中你的扩展视图时停止后台任务,你可以通过以下几种VS Code API方案实现:

1. 监听自定义视图的可见性变化

如果你的扩展有自定义的侧边栏/面板视图(通过createTreeView或registerTreeDataProvider创建),最直接的方式是监听视图的onDidChangeVisibility事件,根据可见状态启动/停止任务。

示例代码

import * as vscode from 'vscode';

let backgroundTask: NodeJS.Timeout | undefined;

export function activate(context: vscode.ExtensionContext) {
    // 创建你的扩展视图(需先在package.json的contributes.views中定义ID)
    const myExtensionView = vscode.window.createTreeView('myExtension.mainView', {
        treeDataProvider: /* 替换为你的TreeDataProvider实例 */
    });

    // 监听视图可见性变化
    const visibilityListener = myExtensionView.onDidChangeVisibility(e => {
        if (e.visible) {
            startBackgroundTask();
        } else {
            stopBackgroundTask();
        }
    });

    // 初始化时根据当前视图状态设置任务
    if (myExtensionView.visible) {
        startBackgroundTask();
    }

    context.subscriptions.push(visibilityListener);
}

function startBackgroundTask() {
    if (!backgroundTask) {
        backgroundTask = setInterval(() => {
            // 执行你的后台任务逻辑
            console.log('Extension view is active, running background task...');
        }, 2000);
    }
}

function stopBackgroundTask() {
    if (backgroundTask) {
        clearInterval(backgroundTask);
        backgroundTask = undefined;
        console.log('Extension view inactive, stopped background task.');
    }
}

2. 监听全局活动视图变化

如果你需要判断当前**活动的视图(无论是否可见)**是否属于你的扩展,可以使用window.onDidChangeActiveView事件,通过视图ID前缀匹配来识别。

示例代码

const activeViewListener = vscode.window.onDidChangeActiveView(view => {
    // 检查视图ID是否属于你的扩展(替换为实际的ID前缀)
    const isMyExtensionView = view.id.startsWith('myExtension.');
    
    if (isMyExtensionView) {
        startBackgroundTask();
    } else {
        stopBackgroundTask();
    }
});

context.subscriptions.push(activeViewListener);

3. 自定义上下文键(可选)

如果需要在package.json中通过上下文键控制命令/快捷键,或者在其他逻辑中快速判断视图状态,可以手动设置自定义上下文键:

// 在视图可见性变化时更新上下文键
function updateContextKey(isVisible: boolean) {
    vscode.commands.executeCommand('setContext', 'myExtension.viewIsActive', isVisible);
}

// 绑定到视图可见性事件
myExtensionView.onDidChangeVisibility(e => updateContextKey(e.visible));

之后你可以在package.json中使用这个上下文键,比如:

"commands": [
    {
        "command": "myExtension.refresh",
        "title": "Refresh",
        "when": "myExtension.viewIsActive"
    }
]

注意事项

  • 视图ID需要提前在package.json的contributes.views字段中定义,确保与代码中使用的ID一致。
  • 如果你的扩展有多个视图,需要针对每个视图的可见性/激活状态做判断,或者统一检查ID前缀。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:20:41