首页 文章

从完全不同的系统进程访问Electron API

提问于
浏览
0

我正在寻找一种方法来捕获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 回答

  • 0

    这可能是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上的电子 .

相关问题