Access Electron API из совершенно другого системного процесса

Tomáš Hübelbauer спросил: 13 июня 2018 в 02:37 в: node.js

Я ищу способ сделать снимок экрана окна хоста расширения VS Code. Это окно открывается, когда выполняются тесты моего расширения (это происходит из шаблона Yeoman по умолчанию для расширений VS-кода).

Я не могу использовать контекст моего расширения, поскольку расширение имеет только доступ к API-интерфейсу VS и VS Code запускает расширения в другом узле процесса с электронного (основного или визуализатора). 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 DevTools приведет к созданию правильного URI данных.

Чтобы иметь возможность сделать это из другого Узел, зная только ПИД-код окна кода, я полагал, что я бы привязал отладчик к окну электронного хоста VS-кода и используя CDP, я бы выпустил вызов Runtime.evaluate для запуска вышеуказанного кода, как если бы он был введен в DevTools.

Однако я борюсь с прикреплением отладчика. Как правило, это два способа сделать это:

  • kill -s SIGUSR1 <node-pid> для Unix / macOS
  • process._debugProcess(proc.pid); для Windows

Я сейчас интересуюсь Windows, поэтому я выпускаю строку Windows из нового процесса Node. Что должно произойти при успешном вложении отладчика, целевой процесс должен распечатать что-то вроде этого:

Debugger listening on ws://127.0.0.1:9229/cf49bcfe-d922-4f89-b438-57755d254198
For help see https://nodejs.org/en/docs/inspector

Однако в моем случае это работает, только если я запустил приложение barebone Electron с --inspect, а затем введите process._debugProcess(proc.pid);, без --inspect, он не выдает ошибку, но не прикрепляет отладчик.


1 ответ

Tomáš Hübelbauer ответил: 14 июня 2018 в 06:51

Это может быть проблема с Electron в Windows, потому что я могу приложить отладчик к процессу простого узла в Windows с помощью process._debugProcess или процесса Electron на macOS с помощью kill -s SIGUSR1, но эти же шаги не будут работать с Electron в Windows с помощью process._debugProcess. Тем не менее, он работает, когда я запускаю Electron в Windows с помощью --inspect, поэтому проблема не отладка сама по себе, а только прикрепление отладчика к Windows.

Я открыл для этого проблему в Electron's GitHub репозиторий:

https://github.com/electron/electron/issues/13580

Есть прикрепленные изображения, которые показывают все сценарии: Узел в Windows с помощью process._debugProcess (работает), Electron в Windows с использованием process._debugProcess (не работает), Electron в Windows с помощью --inspect (рабочий) и Electron на macOS с помощью kill -s SIGUSR1 (работает) .

Дополнительное видео по вопросу: Access Electron API из совершенно другого системного процесса

Electron: Разработка Desktop-приложений, используя HTML, CSS и JavaScript / Дмитрий Васин

Build an Electron App in Under 60 Minutes

Build a Native Desktop App with Electron (YouTube Stats App)