@solazah/solazah-runtime 0.1.154 → 0.1.158
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/package.json +1 -1
- package/types/Plugin.d.ts +7 -0
- package/types/SystemKeyboard.d.ts +43 -0
- package/types/SystemMouse.d.ts +24 -0
- package/types/SystemScreen.d.ts +261 -0
package/package.json
CHANGED
package/types/Plugin.d.ts
CHANGED
|
@@ -144,6 +144,13 @@ export default class Plugin {
|
|
|
144
144
|
* @param enabled 开或关。
|
|
145
145
|
*/
|
|
146
146
|
setContentProtection: (enabled: boolean) => Promise<void>;
|
|
147
|
+
/**
|
|
148
|
+
* 让插件自己的窗口对鼠标透明:点击、滚动全部穿过去落到下面的窗口。给罩在屏幕上只做展示的浮层用
|
|
149
|
+
* (录制期间的选区边框),不然它盖住的那块屏幕就点不到了。
|
|
150
|
+
*
|
|
151
|
+
* @param ignore 开或关。
|
|
152
|
+
*/
|
|
153
|
+
setIgnoreMouseEvents: (ignore: boolean) => Promise<void>;
|
|
147
154
|
/**
|
|
148
155
|
* 取发起方插件自身的完整信息。
|
|
149
156
|
* 通过 webContents 逆向定位插件,返回插件实体字段 + 其全部命令(commands 数组)+
|
|
@@ -16,4 +16,47 @@ export default class SystemKeyboard {
|
|
|
16
16
|
* @returns 选区内容对象 {type, content},type 为 text/image/fileName/fileUrl 之一;无内容时返回 null。
|
|
17
17
|
*/
|
|
18
18
|
copy: () => Promise<any>;
|
|
19
|
+
/**
|
|
20
|
+
* 向当前前台窗口合成一次组合键(按下修饰键→敲主键→全部抬起)。
|
|
21
|
+
*
|
|
22
|
+
* @param combo 组合键字符串,形如 "ctrl+v"、"win+r"、"ctrl+shift+t";分隔符 +、空格、制表符可混用。
|
|
23
|
+
* @returns 无返回
|
|
24
|
+
*/
|
|
25
|
+
keypress: (combo: string) => Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* 按下一个键不抬起,配合 keyUp 做「按住直到条件满足」的闭环控制。键名与 keypress 同一套,但只能是单键。
|
|
28
|
+
* 宿主按调用方记账:本视图销毁、页面整页导航(重载)、宿主退出时,它按着的键全部自动抬起。
|
|
29
|
+
*
|
|
30
|
+
* @param key 键名,形如 "w"、"shift"、"space"、"f5",不区分大小写。
|
|
31
|
+
* @returns 无返回
|
|
32
|
+
* @throws 键名不被支持时抛错(code UNSUPPORTED_KEY)。
|
|
33
|
+
*/
|
|
34
|
+
keyDown: (key: string) => Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* 抬起一个键。抬一个没按着的键也照发,可用来解开账本没记到的键。
|
|
37
|
+
*
|
|
38
|
+
* @param key 键名,与 keyDown 一致。
|
|
39
|
+
* @returns 无返回
|
|
40
|
+
*/
|
|
41
|
+
keyUp: (key: string) => Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* 按住一个键指定时长后抬起,Promise 在抬起后兑现;途中不论出什么异常,抬起都会发出。
|
|
44
|
+
* 需要按住直到某个条件满足时,用 keyDown + keyUp 自己收口。
|
|
45
|
+
*
|
|
46
|
+
* @param key 键名,与 keyDown 一致。
|
|
47
|
+
* @param options `{durationMs}`,按住多少毫秒,不小于 0。
|
|
48
|
+
* @returns 无返回
|
|
49
|
+
*/
|
|
50
|
+
hold: (key: string, options: {
|
|
51
|
+
durationMs: number;
|
|
52
|
+
}) => Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* 急停:抬起本视图按着的全部键与鼠标键(keyDown / hold / systemMouse.buttonDown 按下的)。
|
|
55
|
+
*
|
|
56
|
+
* @returns `{keys, buttons}`,实际抬起了哪些;什么都没按着时两个都是空数组。
|
|
57
|
+
*/
|
|
58
|
+
releaseAll: () => Promise<{
|
|
59
|
+
keys: string[];
|
|
60
|
+
buttons: Array<"left" | "right" | "middle">;
|
|
61
|
+
}>;
|
|
19
62
|
}
|
package/types/SystemMouse.d.ts
CHANGED
|
@@ -79,4 +79,28 @@ export default class SystemMouse {
|
|
|
79
79
|
* @returns 无返回。
|
|
80
80
|
*/
|
|
81
81
|
scroll: (dx: number, dy: number, at?: Point) => Promise<any>;
|
|
82
|
+
/**
|
|
83
|
+
* 从当前光标位置相对移动,给转镜头一类的拖拽用(先 buttonDown,再多次 moveBy,最后 buttonUp)。
|
|
84
|
+
* 走光标定位,不产生原始输入(Raw Input)的相对位移事件;只读原始输入位移的应用看不到这次移动。
|
|
85
|
+
*
|
|
86
|
+
* @param dx 水平位移像素,正数向右。
|
|
87
|
+
* @param dy 垂直位移像素,正数向下。
|
|
88
|
+
* @returns 移动后的光标屏幕坐标 `{x, y}`。
|
|
89
|
+
*/
|
|
90
|
+
moveBy: (dx: number, dy: number) => Promise<Point>;
|
|
91
|
+
/**
|
|
92
|
+
* 按下鼠标键不抬起。宿主按调用方记账:本视图销毁、页面整页导航、宿主退出时自动抬起,
|
|
93
|
+
* systemKeyboard.releaseAll 也会一并抬起。
|
|
94
|
+
*
|
|
95
|
+
* @param button left / right / middle,缺省 left。
|
|
96
|
+
* @returns 无返回
|
|
97
|
+
*/
|
|
98
|
+
buttonDown: (button?: "left" | "right" | "middle") => Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* 抬起鼠标键。
|
|
101
|
+
*
|
|
102
|
+
* @param button left / right / middle,缺省 left。
|
|
103
|
+
* @returns 无返回
|
|
104
|
+
*/
|
|
105
|
+
buttonUp: (button?: "left" | "right" | "middle") => Promise<void>;
|
|
82
106
|
}
|
package/types/SystemScreen.d.ts
CHANGED
|
@@ -63,6 +63,182 @@ export interface GoneWait {
|
|
|
63
63
|
timeoutMs: number;
|
|
64
64
|
cancelled: boolean;
|
|
65
65
|
}
|
|
66
|
+
/** 帧的编码:png / jpeg 时 data 是 Data URL 字符串;raw 时 data 是 BGRA 像素(Uint8Array,自顶向下,每像素 4 字节)。 */
|
|
67
|
+
export type StreamFormat = "png" | "jpeg" | "raw";
|
|
68
|
+
export interface StreamOptions {
|
|
69
|
+
/** 目标显示器 id;省略则是开流那一刻光标所在的显示器,之后不随光标变 */
|
|
70
|
+
displayId?: number;
|
|
71
|
+
/** 只截这一块,显示器物理像素、相对显示器左上角;省略整屏。超出显示器的部分裁掉 */
|
|
72
|
+
region?: ScreenRect;
|
|
73
|
+
/** 每秒几帧,1..30,缺省 10 */
|
|
74
|
+
fps?: number;
|
|
75
|
+
/** 缺省 png。1080p 整屏 png 一帧要几十毫秒且占主进程,高帧率大画面用 jpeg 或 raw */
|
|
76
|
+
format?: StreamFormat;
|
|
77
|
+
/** jpeg 质量 1..100,缺省 85 */
|
|
78
|
+
quality?: number;
|
|
79
|
+
}
|
|
80
|
+
/** 开流的结果:帧从 channel 推来,用 `window.ipcRenderer.on(channel, (_, frame) => …)` 接。 */
|
|
81
|
+
export interface StreamInfo {
|
|
82
|
+
streamId: string;
|
|
83
|
+
/** 帧通道名 screen.stream.frame.<streamId>,一条流一个通道 */
|
|
84
|
+
channel: string;
|
|
85
|
+
displayId: number;
|
|
86
|
+
/** 实际截取的区域(已裁到显示器内),显示器物理像素、相对显示器左上角 */
|
|
87
|
+
region: ScreenRect;
|
|
88
|
+
width: number;
|
|
89
|
+
height: number;
|
|
90
|
+
/** 实际生效的帧率 */
|
|
91
|
+
fps: number;
|
|
92
|
+
format: StreamFormat;
|
|
93
|
+
}
|
|
94
|
+
/** 推来的一帧。 */
|
|
95
|
+
export interface StreamFrame {
|
|
96
|
+
streamId: string;
|
|
97
|
+
/** 从 1 起、逐帧加一:收到的帧序号连续,丢掉的帧不占序号 */
|
|
98
|
+
seq: number;
|
|
99
|
+
/** 抓帧那一刻的墙钟毫秒时间戳,与 Date.now() 同一时基(带亚毫秒小数):插件自己记的事件按 Date.now() 打时间戳就能与帧对齐 */
|
|
100
|
+
at: number;
|
|
101
|
+
width: number;
|
|
102
|
+
height: number;
|
|
103
|
+
format: StreamFormat;
|
|
104
|
+
data: string | Uint8Array;
|
|
105
|
+
/** 到这一帧为止累计丢了几帧(页面没处理完上一帧、或截屏还没回来时到期的拍) */
|
|
106
|
+
dropped: number;
|
|
107
|
+
}
|
|
108
|
+
export interface StreamStats {
|
|
109
|
+
streamId: string;
|
|
110
|
+
/** 推出去的帧数 */
|
|
111
|
+
frames: number;
|
|
112
|
+
dropped: number;
|
|
113
|
+
durationMs: number;
|
|
114
|
+
}
|
|
115
|
+
/** HSV 颜色:h 色相角度 0..360,s 饱和度 0..100,v 明度 0..100。 */
|
|
116
|
+
export interface Hsv {
|
|
117
|
+
h: number;
|
|
118
|
+
s: number;
|
|
119
|
+
v: number;
|
|
120
|
+
}
|
|
121
|
+
export interface ColorBlobOptions {
|
|
122
|
+
/** 色域下限。hsvLow.h 大于 hsvHigh.h 时按跨 0 度处理(红色给 {h: 350} 到 {h: 10}) */
|
|
123
|
+
hsvLow: Hsv;
|
|
124
|
+
hsvHigh: Hsv;
|
|
125
|
+
/** 面积(像素数)不到它的连通域不要,缺省 1 */
|
|
126
|
+
minArea?: number;
|
|
127
|
+
/** 最多返回几个,按面积降序取,缺省 50 */
|
|
128
|
+
maxResults?: number;
|
|
129
|
+
}
|
|
130
|
+
/** 一个色块:外接框、面积(像素数)、质心。 */
|
|
131
|
+
export interface ColorBlob {
|
|
132
|
+
x: number;
|
|
133
|
+
y: number;
|
|
134
|
+
width: number;
|
|
135
|
+
height: number;
|
|
136
|
+
area: number;
|
|
137
|
+
cx: number;
|
|
138
|
+
cy: number;
|
|
139
|
+
}
|
|
140
|
+
/** findBlobs 的来源:图片(Data URL 或本机绝对路径),或截显示器上的一块(region 为显示器物理像素、相对显示器左上角)。 */
|
|
141
|
+
export type BlobSource = string | {
|
|
142
|
+
displayId?: number;
|
|
143
|
+
region?: ScreenRect;
|
|
144
|
+
image?: string;
|
|
145
|
+
};
|
|
146
|
+
export interface RecordStartOptions {
|
|
147
|
+
/** 目标显示器 id;省略取光标所在显示器 */
|
|
148
|
+
displayId?: number;
|
|
149
|
+
/** 只录这一块,显示器物理像素、相对显示器左上角;省略整屏。超出显示器的部分裁掉,宽高取到偶数 */
|
|
150
|
+
region?: ScreenRect;
|
|
151
|
+
/** 目标帧率 1..60;mp4 缺省 30,gif 缺省 12。画面不变时不产生新帧,文件按可变帧率写,时长仍与墙钟一致 */
|
|
152
|
+
fps?: number;
|
|
153
|
+
/** 是否把光标录进去,缺省 true */
|
|
154
|
+
cursor?: boolean;
|
|
155
|
+
/** mp4:H.264 硬件编码;gif:全局调色板抖动量化 */
|
|
156
|
+
format: "mp4" | "gif";
|
|
157
|
+
/** 输出文件的绝对路径,后缀由调用方按 format 定 */
|
|
158
|
+
output: string;
|
|
159
|
+
/** mp4 目标码率(bit/s),省略按分辨率与帧率取 */
|
|
160
|
+
bitrate?: number;
|
|
161
|
+
/** gif 输出最大宽度,省略不缩放 */
|
|
162
|
+
maxWidth?: number;
|
|
163
|
+
/** 到这个秒数自动停,结果留到下一次 stop 取 */
|
|
164
|
+
maxSeconds?: number;
|
|
165
|
+
}
|
|
166
|
+
/** 开始录制的结果:实际生效的区域(已裁到显示器内、取到偶数)与参数。 */
|
|
167
|
+
export interface RecordInfo {
|
|
168
|
+
displayId: number;
|
|
169
|
+
region: ScreenRect;
|
|
170
|
+
width: number;
|
|
171
|
+
height: number;
|
|
172
|
+
fps: number;
|
|
173
|
+
format: "mp4" | "gif";
|
|
174
|
+
output: string;
|
|
175
|
+
/** Date.now() */
|
|
176
|
+
startedAt: number;
|
|
177
|
+
}
|
|
178
|
+
export interface RecordStats {
|
|
179
|
+
path: string;
|
|
180
|
+
format: string;
|
|
181
|
+
/** 实际用的编码器,如 h264_videotoolbox(zero-copy) */
|
|
182
|
+
encoder: string;
|
|
183
|
+
width: number;
|
|
184
|
+
height: number;
|
|
185
|
+
frames: number;
|
|
186
|
+
dropped: number;
|
|
187
|
+
durationMs: number;
|
|
188
|
+
bytes: number;
|
|
189
|
+
displayId: number;
|
|
190
|
+
region: ScreenRect;
|
|
191
|
+
}
|
|
192
|
+
export interface RecordStatus {
|
|
193
|
+
active: boolean;
|
|
194
|
+
frames: number;
|
|
195
|
+
dropped: number;
|
|
196
|
+
elapsedMs: number;
|
|
197
|
+
info: RecordInfo | null;
|
|
198
|
+
/** 自动停下来(到时、视图销毁)还没被 stop 取走的结果 */
|
|
199
|
+
finished: RecordStats | null;
|
|
200
|
+
}
|
|
201
|
+
export interface LongShotOptions {
|
|
202
|
+
/** 目标显示器 id;省略取光标所在显示器 */
|
|
203
|
+
displayId?: number;
|
|
204
|
+
/** 要截取的区域,显示器物理像素、相对显示器左上角;省略整屏 */
|
|
205
|
+
region?: ScreenRect;
|
|
206
|
+
/** 输出 PNG 的绝对路径 */
|
|
207
|
+
output: string;
|
|
208
|
+
/**
|
|
209
|
+
* 排查用:把每一帧连同当帧算出的判定落到这个目录,供离线重放。
|
|
210
|
+
* 编码每帧会拖慢抓取节奏(滚动会发涩),只在查问题时开。
|
|
211
|
+
*/
|
|
212
|
+
traceDir?: string;
|
|
213
|
+
}
|
|
214
|
+
export interface LongShotResult {
|
|
215
|
+
path: string;
|
|
216
|
+
width: number;
|
|
217
|
+
height: number;
|
|
218
|
+
/** 在第一屏之后接上了几段 */
|
|
219
|
+
segments: number;
|
|
220
|
+
}
|
|
221
|
+
export interface LongShotStatus {
|
|
222
|
+
active: boolean;
|
|
223
|
+
/** 已拼长图的宽高(物理像素) */
|
|
224
|
+
width: number;
|
|
225
|
+
height: number;
|
|
226
|
+
/** 当前屏顶边在长图里的位置与当前屏高度(物理像素);滚到起点之上时 viewportTop 为负 */
|
|
227
|
+
viewportTop: number;
|
|
228
|
+
viewportHeight: number;
|
|
229
|
+
/** 任何变化(接上新内容、视口移动)都加 1 */
|
|
230
|
+
version: number;
|
|
231
|
+
/** 缩略图变化(接上新内容)时加 1 */
|
|
232
|
+
thumbVersion: number;
|
|
233
|
+
/** 长图到了高度上限,不再接 */
|
|
234
|
+
capped: boolean;
|
|
235
|
+
/** since 早于 thumbVersion 时才有:整幅长图的缩略图 PNG Data URL 与尺寸 */
|
|
236
|
+
thumbnail?: {
|
|
237
|
+
dataUrl: string;
|
|
238
|
+
width: number;
|
|
239
|
+
height: number;
|
|
240
|
+
};
|
|
241
|
+
}
|
|
66
242
|
export default class SystemScreen {
|
|
67
243
|
private transport;
|
|
68
244
|
constructor(transport?: IpcRenderer);
|
|
@@ -256,4 +432,89 @@ export default class SystemScreen {
|
|
|
256
432
|
* @returns 该点的 RGBA 颜色值 `{R, G, B, A}`,各通道 0–255。
|
|
257
433
|
*/
|
|
258
434
|
colorAt: (point: Point) => Promise<any>;
|
|
435
|
+
/**
|
|
436
|
+
* 连续截图流:宿主按 fps 截显示器(或其中一块区域),逐帧推给本视图。
|
|
437
|
+
* 区域在宿主侧直接截,不是整屏截了再裁。背压由宿主处理:页面还没处理完上一帧就到期的拍直接丢,
|
|
438
|
+
* 绝不排队;每帧的 dropped 与 stop 的统计里能看到丢了多少。本视图销毁时流自动停。
|
|
439
|
+
*
|
|
440
|
+
* 用法:`const {channel} = await start({fps: 10, region}); window.ipcRenderer.on(channel, (_, frame) => …)`。
|
|
441
|
+
* 帧通道是单监听(同 ipcRenderer.on 的约定),一条流一个通道,多条流互不影响。
|
|
442
|
+
*/
|
|
443
|
+
stream: {
|
|
444
|
+
/**
|
|
445
|
+
* 开一条流。
|
|
446
|
+
*
|
|
447
|
+
* @param options `{displayId?, region?, fps?, format?, quality?}`,fps 上限 30。
|
|
448
|
+
* @returns `{streamId, channel, displayId, region, width, height, fps, format}`。
|
|
449
|
+
* @throws 显示器不存在、区域完全在显示器外时抛错。
|
|
450
|
+
*/
|
|
451
|
+
start: (options?: StreamOptions) => Promise<StreamInfo>;
|
|
452
|
+
/**
|
|
453
|
+
* 停一条流,之后不再有帧。
|
|
454
|
+
*
|
|
455
|
+
* @param streamId start 给的流 id。
|
|
456
|
+
* @returns `{streamId, frames, dropped, durationMs}`;不是本视图开的、或已经停了给 null。
|
|
457
|
+
*/
|
|
458
|
+
stop: (streamId: string) => Promise<StreamStats | null>;
|
|
459
|
+
};
|
|
460
|
+
/**
|
|
461
|
+
* 色域连通域检测:把落在 HSV 阈值内的像素连成块,给回每块的外接框、面积、质心,按面积降序。
|
|
462
|
+
* 给闭环控制里认血条、准星、标记点这类纯色目标用。
|
|
463
|
+
*
|
|
464
|
+
* @param source 图片的 Data URL 或本机绝对路径;或 `{displayId?, region?}` 截显示器上的一块(缺省光标所在显示器整屏);
|
|
465
|
+
* `{image, region}` 则在给定图片里只看一块。
|
|
466
|
+
* @param options `{hsvLow, hsvHigh, minArea?, maxResults?}`,h 0..360、s 与 v 0..100。
|
|
467
|
+
* @returns `[{x, y, width, height, area, cx, cy}]`;给图片时坐标相对图片左上角,截屏时是屏幕物理像素坐标。找不到是空数组。
|
|
468
|
+
*/
|
|
469
|
+
findBlobs: (source: BlobSource, options: ColorBlobOptions) => Promise<ColorBlob[]>;
|
|
470
|
+
/**
|
|
471
|
+
* 屏幕录制:采集与编码全在宿主的原生线程(mac ScreenCaptureKit + VideoToolbox 硬件 H.264,Windows WGC + Media Foundation),
|
|
472
|
+
* mp4 或 gif 直接写到给定路径,页面不经手任何帧。同一时刻只有一个会话;本视图销毁、到了 maxSeconds 都会自动停。
|
|
473
|
+
*
|
|
474
|
+
* 用法:`await record.start({format: "mp4", output, region})` … `const stats = await record.stop()`;
|
|
475
|
+
* 录制中用 `record.status()` 取帧数与已录时长。
|
|
476
|
+
*/
|
|
477
|
+
record: {
|
|
478
|
+
/**
|
|
479
|
+
* 开始录制。
|
|
480
|
+
*
|
|
481
|
+
* @param options `{displayId?, region?, fps?, cursor?, format, output, bitrate?, maxWidth?, maxSeconds?}`。
|
|
482
|
+
* @returns `{displayId, region, width, height, fps, format, output, startedAt}`。
|
|
483
|
+
* @throws 已有录制、区域太小、平台不支持时抛错。
|
|
484
|
+
*/
|
|
485
|
+
start: (options: RecordStartOptions) => Promise<RecordInfo>;
|
|
486
|
+
/**
|
|
487
|
+
* 停止并给回统计;录制已经自动停了就给那一次的结果。
|
|
488
|
+
*
|
|
489
|
+
* @returns `{path, format, encoder, width, height, frames, dropped, durationMs, bytes, displayId, region}`。
|
|
490
|
+
*/
|
|
491
|
+
stop: () => Promise<RecordStats>;
|
|
492
|
+
/** 取消:停下来并删掉已写的文件;录制已经自动停了就删那次的产物。 */
|
|
493
|
+
cancel: () => Promise<void>;
|
|
494
|
+
/** 进行中的帧数、丢帧、已录时长、会话信息;自动停下来还没取走的结果在 finished 里。 */
|
|
495
|
+
status: () => Promise<RecordStatus>;
|
|
496
|
+
};
|
|
497
|
+
/**
|
|
498
|
+
* 滚动长截图:宿主盯着区域,使用者自己滚动页面,每帧与上一帧比出位移后把新露出的部分接上去,finish 时把 PNG 写到给定路径。
|
|
499
|
+
* 粘性头部/底部的页面靠只比中间一条窄带减轻错位,仍可能拼得不完美。
|
|
500
|
+
*/
|
|
501
|
+
longshot: {
|
|
502
|
+
/**
|
|
503
|
+
* 开始一张长图,直到 finish 或 cancel 才返回。
|
|
504
|
+
*
|
|
505
|
+
* @param options `{displayId?, region?, output}`。
|
|
506
|
+
* @returns `{path, width, height, segments}`;被 cancel 取消时是 null。
|
|
507
|
+
*/
|
|
508
|
+
capture: (options: LongShotOptions) => Promise<LongShotResult | null>;
|
|
509
|
+
/** 收尾:停止拼接、把已拼的长图落盘,capture 随之返回。 */
|
|
510
|
+
finish: () => Promise<void>;
|
|
511
|
+
/** 取消:停止拼接、不落盘,capture 返回 null。 */
|
|
512
|
+
cancel: () => Promise<void>;
|
|
513
|
+
/**
|
|
514
|
+
* 进行中长截图的状态:已拼尺寸、当前屏位置、版本号。
|
|
515
|
+
*
|
|
516
|
+
* @param since 上次拿到的 thumbVersion;缩略图没变就不再附带。省略则总是附带。
|
|
517
|
+
*/
|
|
518
|
+
status: (since?: number) => Promise<LongShotStatus>;
|
|
519
|
+
};
|
|
259
520
|
}
|