我正在寻找一种方法来捕获VS Code扩展主机窗口的屏幕截图 . 当我的扩展程序的测试运行时,这个窗口打开(这来自VS代码扩展的默认Yeoman模板) .
我不能使用我的扩展的上下文,因为扩展只能访问VS Code API,而VS Code在与Electron one(主要或渲染器)不同的Node进程中运行扩展 . IPC通过API使用,而不是在进程中运行扩展 .
我可以在Electron渲染器过程中运行此代码(使用DevTools或作为Electron应用程序脚本的一部分)来捕获Electron窗口:
const electron = require('electron');
electron.remote.getCurrentWindow().capturePage(image => {
//electron.clipboard.writeImage(image);
electron.clipboard.writeText(image.toDataURL());
console.log('Data URL is in clipboard.');
});
我已经确认将其置于VS Code窗口DevTools中将生成正确的数据URI .
为了能够从不同的Node进程执行此操作,只知道Code窗口PID,我想我会将调试器附加到VS Code扩展主机Electron窗口并使用CDP我会发出 Runtime.evaluate
调用来运行上面的代码好像它已进入DevTools .
但是,我正在努力附加调试器 . 通常有两种方法:
-
kill -s SIGUSR1 <node-pid>
for Unix / macOS -
process._debugProcess(proc.pid);
for Windows
我现在对Windows很感兴趣,所以我从一个新的Node进程发出Windows一行 . 成功调试器附件后应该发生的是目标进程应打印出如下内容:
Debugger listening on ws://127.0.0.1:9229/cf49bcfe-d922-4f89-b438-57755d254198
For help see https://nodejs.org/en/docs/inspector
但是在我的情况下,这只有在我使用 --inspect
启动准系统电子应用程序然后发出 process._debugProcess(proc.pid);
,而没有 --inspect
它没有't throw an error, but doesn' t附加调试器时才有效 .
1 回答
这可能是Windows上Electron的问题,因为我可以使用
kill -s SIGUSR1
在macOS上使用process._debugProcess
或电子进程将调试器附加到Windows上的普通节点进程,但是相同的步骤不适用于使用process._debugProcess
的Windows上的Electron . 但是,当我使用--inspect
在Windows上运行Electron时,它确实有效,因此问题不是调试本身,而是仅在Windows上附加调试器 .我在Electron的GitHub存储库中为此打开了一个问题:
https://github.com/electron/electron/issues/13580
附加的图像显示所有场景:Windows上的节点使用
process._debugProcess
(工作),Windows上的电子使用process._debugProcess
(不工作),Windows上的电子使用--inspect
(工作)和使用kill -s SIGUSR1
(工作)的macOS上的电子 .