【发布时间】:2018-12-15 22:02:57
【问题描述】:
我正在寻找一种方法来捕获 VS Code 扩展主机窗口的屏幕截图。运行我的扩展程序测试时会打开此窗口(这来自 VS Code 扩展程序的默认 Yeoman 模板)。
我无法使用我的扩展程序的上下文,因为扩展程序只能访问 VS Code API,并且 VS Code 在与 Electron 不同的 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 进程执行此操作,只知道代码窗口 PID,我想我会在 VS Code 扩展主机 Electron 窗口上附加一个调试器,并使用 CDP 我会发出一个Runtime.evaluate 调用像输入到 DevTools 一样运行上面的代码。
但是,我正在努力附加调试器。一般有两种方法:
-
kill -s SIGUSR1 <node-pid>适用于 Unix/macOS -
process._debugProcess(proc.pid);适用于 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 启动准系统 Electron 应用程序然后发出process._debugProcess(proc.pid); 时才有效,没有--inspect 它不会引发错误,但也不会附加调试器。
【问题讨论】:
-
有没有办法选择一个任意的系统进程(例如通过 PID),测试它是否是一个 Node 进程并插入该进程的 JS 上下文以便能够调用 JS API在里面? - 听起来像黑客攻击。如果它是您的应用程序,请考虑提供某种 IPC(HTTP 或其他)。例如,请参阅github.com/RIAEvangelist/node-ipc
-
考虑到你在问这个问题,我猜你不走运。通过“黑客”,我的意思是真正的黑客,特定于您的操作系统。我不熟悉 VS Code 生态系统。充当中介的扩展是否可以访问您需要的 API?如果可能的话,你可以安装它,通过 IPC 请求它来制作屏幕截图。
-
看到你的 GH 问题。是的,如果不可能,那你就不走运了。如果 Electron 应用程序不允许以某种方式侵入它(我想 VS Code 不允许),它并不比侵入任何其他随机应用程序并让它做某事更容易。我想您最好的选择是使用 github.com/johnvmt/node-desktop-screenshot 制作与应用程序无关的屏幕截图。或者创建一个自定义的 VS Code 版本,允许以某种方式访问 Electron API(CLI 或 IPC),如果这对你有用的话。
-
上面的 cmets 现在已经过时了,因为我已经确定了一种可行的方法(调试协议),但是遇到了一个潜在的 Electron Windows 错误,因此问题转向了这个问题。我已删除不再有效的 cmets。
标签: node.js electron google-chrome-devtools node-inspector chrome-devtools-protocol