electron-screenshots 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/lib/index.js +1 -1
- package/lib/preload.js +15 -1
- package/lib/screenshots.d.ts +3 -2
- package/lib/screenshots.js +140 -80
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -111,10 +111,10 @@ export interface ScreenshotsOpts {
|
|
|
111
111
|
|
|
112
112
|
| 名称 | 说明 | 返回值 |
|
|
113
113
|
| ------------------------------------ | ---------------- | ------ |
|
|
114
|
-
| `constructor(opts: ScreenshotsOpts)` | 调用截图方法截图 | - |
|
|
115
|
-
| `startCapture()
|
|
116
|
-
| `endCapture()
|
|
117
|
-
| `setLang(lang: Lang)` | 修改语言 | - |
|
|
114
|
+
| `constructor(opts: ScreenshotsOpts): Screenshots` | 调用截图方法截图 | - |
|
|
115
|
+
| `startCapture(): Promise<void>` | 调用截图方法截图 | - |
|
|
116
|
+
| `endCapture(): Promise<void>` | 手动结束截图 | - |
|
|
117
|
+
| `setLang(lang: Lang): void` | 修改语言 | - |
|
|
118
118
|
|
|
119
119
|
## Events
|
|
120
120
|
|
package/lib/index.js
CHANGED
|
@@ -3,8 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
var electron_debug_1 = __importDefault(require("electron-debug"));
|
|
7
6
|
var electron_1 = require("electron");
|
|
7
|
+
var electron_debug_1 = __importDefault(require("electron-debug"));
|
|
8
8
|
var screenshots_1 = __importDefault(require("./screenshots"));
|
|
9
9
|
electron_1.app.whenReady().then(function () {
|
|
10
10
|
var screenshots = new screenshots_1.default({
|
package/lib/preload.js
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
3
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
4
|
+
if (ar || !(i in from)) {
|
|
5
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
6
|
+
ar[i] = from[i];
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
10
|
+
};
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
var electron_1 = require("electron");
|
|
4
13
|
var map = new Map();
|
|
@@ -7,6 +16,10 @@ electron_1.contextBridge.exposeInMainWorld('screenshots', {
|
|
|
7
16
|
console.log('contextBridge ready');
|
|
8
17
|
electron_1.ipcRenderer.send('SCREENSHOTS:ready');
|
|
9
18
|
},
|
|
19
|
+
reset: function () {
|
|
20
|
+
console.log('contextBridge reset');
|
|
21
|
+
electron_1.ipcRenderer.send('SCREENSHOTS:reset');
|
|
22
|
+
},
|
|
10
23
|
save: function (arrayBuffer, data) {
|
|
11
24
|
console.log('contextBridge save', arrayBuffer, data);
|
|
12
25
|
electron_1.ipcRenderer.send('SCREENSHOTS:save', Buffer.from(arrayBuffer), data);
|
|
@@ -27,7 +40,8 @@ electron_1.contextBridge.exposeInMainWorld('screenshots', {
|
|
|
27
40
|
for (var _i = 1; _i < arguments.length; _i++) {
|
|
28
41
|
args[_i - 1] = arguments[_i];
|
|
29
42
|
}
|
|
30
|
-
|
|
43
|
+
console.log.apply(console, __spreadArray(['contextBridge on', channel, fn], args, false));
|
|
44
|
+
fn.apply(void 0, args);
|
|
31
45
|
};
|
|
32
46
|
var listeners = (_a = map.get(fn)) !== null && _a !== void 0 ? _a : {};
|
|
33
47
|
listeners[channel] = listener;
|
package/lib/screenshots.d.ts
CHANGED
|
@@ -33,15 +33,16 @@ export default class Screenshots extends Events {
|
|
|
33
33
|
/**
|
|
34
34
|
* 开始截图
|
|
35
35
|
*/
|
|
36
|
-
startCapture(): void
|
|
36
|
+
startCapture(): Promise<void>;
|
|
37
37
|
/**
|
|
38
38
|
* 结束截图
|
|
39
39
|
*/
|
|
40
|
-
endCapture(): void
|
|
40
|
+
endCapture(): Promise<void>;
|
|
41
41
|
/**
|
|
42
42
|
* 设置语言
|
|
43
43
|
*/
|
|
44
44
|
setLang(lang: Partial<Lang>): void;
|
|
45
|
+
private reset;
|
|
45
46
|
/**
|
|
46
47
|
* 初始化窗口
|
|
47
48
|
*/
|
package/lib/screenshots.js
CHANGED
|
@@ -112,23 +112,25 @@ var Screenshots = /** @class */ (function (_super) {
|
|
|
112
112
|
* 开始截图
|
|
113
113
|
*/
|
|
114
114
|
Screenshots.prototype.startCapture = function () {
|
|
115
|
-
var
|
|
116
|
-
this
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
115
|
+
var _a, _b;
|
|
116
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
117
|
+
var _c, bound, display, imageUrl;
|
|
118
|
+
return __generator(this, function (_d) {
|
|
119
|
+
switch (_d.label) {
|
|
120
|
+
case 0:
|
|
121
|
+
this.logger('startCapture');
|
|
122
|
+
_c = (0, getBoundAndDisplay_1.default)(), bound = _c.bound, display = _c.display;
|
|
123
|
+
return [4 /*yield*/, Promise.all([this.capture(display), this.isReady])];
|
|
124
|
+
case 1:
|
|
125
|
+
imageUrl = (_d.sent())[0];
|
|
126
|
+
return [4 /*yield*/, this.createWindow(bound)];
|
|
127
|
+
case 2:
|
|
128
|
+
_d.sent();
|
|
129
|
+
this.$view.webContents.send('SCREENSHOTS:capture', display, imageUrl);
|
|
130
|
+
(_a = this.$win) === null || _a === void 0 ? void 0 : _a.show();
|
|
131
|
+
(_b = this.$win) === null || _b === void 0 ? void 0 : _b.focus();
|
|
132
|
+
return [2 /*return*/];
|
|
133
|
+
}
|
|
132
134
|
});
|
|
133
135
|
});
|
|
134
136
|
};
|
|
@@ -136,12 +138,25 @@ var Screenshots = /** @class */ (function (_super) {
|
|
|
136
138
|
* 结束截图
|
|
137
139
|
*/
|
|
138
140
|
Screenshots.prototype.endCapture = function () {
|
|
139
|
-
this
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
141
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
142
|
+
return __generator(this, function (_a) {
|
|
143
|
+
switch (_a.label) {
|
|
144
|
+
case 0:
|
|
145
|
+
this.logger('endCapture');
|
|
146
|
+
return [4 /*yield*/, this.reset()];
|
|
147
|
+
case 1:
|
|
148
|
+
_a.sent();
|
|
149
|
+
if (!this.$win) {
|
|
150
|
+
return [2 /*return*/];
|
|
151
|
+
}
|
|
152
|
+
this.$win.setBrowserView(null);
|
|
153
|
+
this.$win.setSimpleFullScreen(false);
|
|
154
|
+
this.$win.close();
|
|
155
|
+
this.$win = null;
|
|
156
|
+
return [2 /*return*/];
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
});
|
|
145
160
|
};
|
|
146
161
|
/**
|
|
147
162
|
* 设置语言
|
|
@@ -153,74 +168,121 @@ var Screenshots = /** @class */ (function (_super) {
|
|
|
153
168
|
_this.$view.webContents.send('SCREENSHOTS:setLang', lang);
|
|
154
169
|
});
|
|
155
170
|
};
|
|
171
|
+
Screenshots.prototype.reset = function () {
|
|
172
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
173
|
+
return __generator(this, function (_a) {
|
|
174
|
+
switch (_a.label) {
|
|
175
|
+
case 0:
|
|
176
|
+
// 重置截图区域
|
|
177
|
+
this.$view.webContents.send('SCREENSHOTS:reset');
|
|
178
|
+
// 保证 UI 有足够的时间渲染
|
|
179
|
+
return [4 /*yield*/, Promise.race([
|
|
180
|
+
new Promise(function (resolve) { return setTimeout(function () { return resolve(); }, 500); }),
|
|
181
|
+
new Promise(function (resolve) { return electron_1.ipcMain.once('SCREENSHOTS:reset', function () { return resolve(); }); })
|
|
182
|
+
])];
|
|
183
|
+
case 1:
|
|
184
|
+
// 保证 UI 有足够的时间渲染
|
|
185
|
+
_a.sent();
|
|
186
|
+
return [2 /*return*/];
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
};
|
|
156
191
|
/**
|
|
157
192
|
* 初始化窗口
|
|
158
193
|
*/
|
|
159
|
-
Screenshots.prototype.createWindow = function (
|
|
160
|
-
var
|
|
161
|
-
this
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
194
|
+
Screenshots.prototype.createWindow = function (bound) {
|
|
195
|
+
var _a, _b;
|
|
196
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
197
|
+
var _this = this;
|
|
198
|
+
return __generator(this, function (_c) {
|
|
199
|
+
switch (_c.label) {
|
|
200
|
+
case 0:
|
|
201
|
+
// 重置截图区域
|
|
202
|
+
return [4 /*yield*/, this.reset()
|
|
203
|
+
// 复用未销毁的窗口
|
|
204
|
+
];
|
|
205
|
+
case 1:
|
|
206
|
+
// 重置截图区域
|
|
207
|
+
_c.sent();
|
|
208
|
+
// 复用未销毁的窗口
|
|
209
|
+
if (!this.$win || ((_b = (_a = this.$win) === null || _a === void 0 ? void 0 : _a.isDestroyed) === null || _b === void 0 ? void 0 : _b.call(_a))) {
|
|
210
|
+
this.$win = new electron_1.BrowserWindow({
|
|
211
|
+
title: 'screenshots',
|
|
212
|
+
x: bound.x,
|
|
213
|
+
y: bound.y,
|
|
214
|
+
width: bound.width,
|
|
215
|
+
height: bound.height,
|
|
216
|
+
useContentSize: true,
|
|
217
|
+
frame: false,
|
|
218
|
+
show: false,
|
|
219
|
+
autoHideMenuBar: true,
|
|
220
|
+
transparent: true,
|
|
221
|
+
resizable: false,
|
|
222
|
+
movable: false,
|
|
223
|
+
// focusable: true, 否则窗口不能及时响应esc按键,输入框也不能输入
|
|
224
|
+
focusable: true,
|
|
225
|
+
fullscreen: true,
|
|
226
|
+
// 设为true 防止mac新开一个桌面,影响效果
|
|
227
|
+
simpleFullscreen: true,
|
|
228
|
+
backgroundColor: '#00000000',
|
|
229
|
+
titleBarStyle: 'hidden',
|
|
230
|
+
alwaysOnTop: true,
|
|
231
|
+
enableLargerThanScreen: true,
|
|
232
|
+
skipTaskbar: true,
|
|
233
|
+
hasShadow: false,
|
|
234
|
+
minimizable: false,
|
|
235
|
+
maximizable: false,
|
|
236
|
+
paintWhenInitiallyHidden: false
|
|
237
|
+
});
|
|
238
|
+
// 确保获得焦点
|
|
239
|
+
this.$win.on('show', function () {
|
|
240
|
+
var _a;
|
|
241
|
+
(_a = _this.$win) === null || _a === void 0 ? void 0 : _a.focus();
|
|
242
|
+
setImmediate(function () {
|
|
243
|
+
var _a;
|
|
244
|
+
(_a = _this.$win) === null || _a === void 0 ? void 0 : _a.focus();
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
this.$win.setBounds(bound);
|
|
249
|
+
this.$win.setBrowserView(this.$view);
|
|
250
|
+
this.$view.setBounds({
|
|
251
|
+
x: 0,
|
|
252
|
+
y: 0,
|
|
253
|
+
width: bound.width,
|
|
254
|
+
height: bound.height
|
|
255
|
+
});
|
|
256
|
+
return [2 /*return*/];
|
|
257
|
+
}
|
|
258
|
+
});
|
|
193
259
|
});
|
|
194
|
-
this.$win.setBrowserView(this.$view);
|
|
195
|
-
this.$view.setBounds(bound);
|
|
196
260
|
};
|
|
197
|
-
Screenshots.prototype.capture = function (
|
|
198
|
-
var display = _a.display;
|
|
261
|
+
Screenshots.prototype.capture = function (display) {
|
|
199
262
|
return __awaiter(this, void 0, void 0, function () {
|
|
200
263
|
var NodeScreenshots, capturer, image, err_1, sources, source;
|
|
201
|
-
return __generator(this, function (
|
|
202
|
-
switch (
|
|
264
|
+
return __generator(this, function (_a) {
|
|
265
|
+
switch (_a.label) {
|
|
203
266
|
case 0:
|
|
204
267
|
this.logger('SCREENSHOTS:capture');
|
|
205
|
-
|
|
268
|
+
_a.label = 1;
|
|
206
269
|
case 1:
|
|
207
|
-
|
|
270
|
+
_a.trys.push([1, 4, , 6]);
|
|
208
271
|
return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('node-screenshots')); })];
|
|
209
272
|
case 2:
|
|
210
|
-
NodeScreenshots = (
|
|
273
|
+
NodeScreenshots = (_a.sent()).Screenshots;
|
|
211
274
|
capturer = NodeScreenshots.fromDisplay(display.id);
|
|
212
|
-
this.logger('SCREENSHOTS:NodeScreenshots.fromDisplay(%d) %o', display.id, capturer);
|
|
275
|
+
this.logger('SCREENSHOTS:capture NodeScreenshots.fromDisplay(%d) %o', display.id, capturer);
|
|
213
276
|
if (!capturer) {
|
|
214
277
|
throw new Error("NodeScreenshots.fromDisplay(".concat(display.id, ") get null"));
|
|
215
278
|
}
|
|
216
279
|
return [4 /*yield*/, capturer.capture()];
|
|
217
280
|
case 3:
|
|
218
|
-
image =
|
|
219
|
-
|
|
220
|
-
return [3 /*break*/, 6];
|
|
281
|
+
image = _a.sent();
|
|
282
|
+
return [2 /*return*/, "data:image/png;base64,".concat(image.toString('base64'))];
|
|
221
283
|
case 4:
|
|
222
|
-
err_1 =
|
|
223
|
-
this.logger('SCREENSHOTS:
|
|
284
|
+
err_1 = _a.sent();
|
|
285
|
+
this.logger('SCREENSHOTS:capture NodeScreenshots capture() error %o', err_1);
|
|
224
286
|
return [4 /*yield*/, electron_1.desktopCapturer.getSources({
|
|
225
287
|
types: ['screen'],
|
|
226
288
|
thumbnailSize: {
|
|
@@ -229,9 +291,10 @@ var Screenshots = /** @class */ (function (_super) {
|
|
|
229
291
|
}
|
|
230
292
|
})];
|
|
231
293
|
case 5:
|
|
232
|
-
sources =
|
|
294
|
+
sources = _a.sent();
|
|
233
295
|
source = void 0;
|
|
234
|
-
// Linux系统上,screen.getDisplayNearestPoint 返回的 Display 对象的 id
|
|
296
|
+
// Linux系统上,screen.getDisplayNearestPoint 返回的 Display 对象的 id
|
|
297
|
+
// 和这里 source 对象上的 display_id(Linux上,这个值是空字符串) 或 id 的中间部分,都不一致
|
|
235
298
|
// 但是,如果只有一个显示器的话,其实不用判断,直接返回就行
|
|
236
299
|
if (sources.length === 1) {
|
|
237
300
|
source = sources[0];
|
|
@@ -242,13 +305,10 @@ var Screenshots = /** @class */ (function (_super) {
|
|
|
242
305
|
});
|
|
243
306
|
}
|
|
244
307
|
if (!source) {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
console.error("Can't find screen source");
|
|
248
|
-
return [2 /*return*/];
|
|
308
|
+
this.logger("SCREENSHOTS:capture Can't find screen source. sources: %o, display: %o", sources, display);
|
|
309
|
+
throw new Error("Can't find screen source");
|
|
249
310
|
}
|
|
250
|
-
|
|
251
|
-
return [3 /*break*/, 6];
|
|
311
|
+
return [2 /*return*/, source.thumbnail.toDataURL()];
|
|
252
312
|
case 6: return [2 /*return*/];
|
|
253
313
|
}
|
|
254
314
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "electron-screenshots",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.4",
|
|
4
4
|
"description": "electron 截图插件",
|
|
5
5
|
"types": "lib/screenshots.d.ts",
|
|
6
6
|
"main": "lib/screenshots.js",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"debug": "^4.3.3",
|
|
39
39
|
"fs-extra": "^10.1.0",
|
|
40
40
|
"node-screenshots": "^0.0.3",
|
|
41
|
-
"react-screenshots": "^0.4.
|
|
41
|
+
"react-screenshots": "^0.4.4"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"electron": ">=11"
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"rimraf": "^3.0.2",
|
|
60
60
|
"typescript": "^4.5.5"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "4731a04ae6ad2afa477b54b472c28711c0c7eb16"
|
|
63
63
|
}
|