rust-rpa 0.2.6-beta.2 → 0.2.7

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.
Files changed (3) hide show
  1. package/README.md +25 -9
  2. package/index.d.ts +53 -38
  3. package/package.json +5 -5
package/README.md CHANGED
@@ -205,7 +205,7 @@ main();
205
205
  - `setBounds(bounds)` - 设置窗口边界
206
206
  - `toJSON()` - 转为 JSON 对象
207
207
  - `captureImage(options?)` - 截图
208
- - `watchChanges(options?, callback)` - 监听窗口内容变化;返回 `WindowWatcher`(`stop()` / `isRunning()`),回调无参数;`stableFrames` 选项可过滤光标闪烁等瞬态变化
208
+ - `watchChanges(options?, callback)` - 监听窗口内容变化;返回 `WindowWatcher`(`stop()` / `isRunning()` / `changeOptions()`);启动时先建基线**不**调回调,仅在检测到相对上一帧的变化时调用 `callback(info)`(`info` 含 `changeRatio` 变化比例和 `changedPixels` 估算变化像素数);`regions` 可指定多个逻辑像素监控区域;`minChangedPixels` 可按原图逻辑像素数控制触发门槛;`minPixelDiff` 可设置单像素最小通道差异(默认 30)过滤截图噪声
209
209
  - `recognizeText(options?)` - OCR 识别文字
210
210
  - `findText(text, options?)` - 查找文字
211
211
  - `findIcon(template, options?)` - 查找图标
@@ -591,16 +591,32 @@ if (targetWindow) {
591
591
 
592
592
  ## 更新日志
593
593
 
594
- ### 0.2.6
594
+ ### 0.2.7
595
595
 
596
596
  #### 新功能
597
597
 
598
- - **Window.watchChanges 新增 `stableFrames` 选项**: 支持过滤光标闪烁等瞬态变化,仅检测真实内容变化
599
- - `stableFrames: 0`(默认)- 检测到变化即触发回调,最快响应
600
- - `stableFrames: N` - 需连续 N 帧与上一帧相比均有变化才触发回调
601
- - 过滤光标闪烁原理:光标闪烁 ON→OFF 一次变化、OFF→OFF 无变化则计数重置,无法连续 N 帧;而真实内容变化(新消息出现)会持续与旧基线不同,连续 N 帧均有变化
602
- - 推荐 `stableFrames: 2` 可过滤大多数光标闪烁
603
- - 示例:`window.watchChanges({ threshold: 0.02, stableFrames: 2 }, callback)`
598
+ - **Window.watchChanges 新增 `minChangedPixels` 参数**: 支持按原图逻辑像素数控制变化触发,与 `threshold` 为 AND 关系
599
+ - `minChangedPixels: 0`(默认)- 不使用此条件,仅靠 `threshold` 控制
600
+ - `minChangedPixels > 0` - 估算的原图逻辑像素变化数须 >= 该值才触发回调
601
+ - 示例:`{ threshold: 0.001, minChangedPixels: 500 }` 表示变化比例超过 0.1% **且** 至少 500 个逻辑像素变化才触发
602
+ - **Window.watchChanges 新增 `minPixelDiff` 参数**: 单像素最小通道差异(0-255),默认 30,用于过滤截图捕获噪声
603
+ - `minPixelDiff: 30`(默认)- R/G/B 任一通道差值 30 才算“变化”,有效过滤截图噪声(通常差值 1-10)
604
+ - `minPixelDiff: 0` - 任意微小差异都计入(最敏感,但噪声也会触发)
605
+ - `minPixelDiff: 1` - 任意像素差异都计入(精确字节比较)
606
+ - 示例:`{ threshold: 0, minChangedPixels: 2, minPixelDiff: 30 }` 过滤噪声同时保持对光标闪烁等微小变化的灵敏度
607
+ - **Window.watchChanges 回调参数改为对象**: `callback(info)`,`info` 为 `{ changeRatio, changedPixels }`,其中 `changeRatio` 为相邻两帧像素变化比例(约 0.0–1.0),`changedPixels` 为估算的原图逻辑像素变化数;**启动首帧不触发回调**(仅建基线);两帧缓冲区长度不一致时 `changeRatio` 为 `1`、`changedPixels` 为 `4294967295`。
608
+
609
+ ### 0.2.6
610
+
611
+ #### 行为调整
612
+
613
+ - **Window.watchChanges 启动**:首帧仅建立对比基线,**不**调用 `callback`;仅在后续轮询检测到相对上一帧的变化时才触发回调。
614
+
615
+ #### 破坏性变更
616
+
617
+ - **Window.watchChanges 选项**: `region` 已改为 `regions`(`CaptureRegion` 数组),可指定多个监控区域;
618
+ - **`WindowWatcher.changeOptions(options)`**: 可按字段合并更新当前监听参数(仅传入字段覆盖,未传字段保持原值),下一轮轮询起生效;若已 `stop()` 再调用会报错。
619
+ - **`Window.watchChanges` 回调参数**: `callback(changeRatio)`,`changeRatio` 为相邻两帧在降采样图上的像素变化比例(约 0.0–1.0);**启动首帧不触发回调**(仅建基线);两帧缓冲区长度不一致时为 `1`。
604
620
 
605
621
  ### 0.2.5
606
622
 
@@ -636,7 +652,7 @@ if (targetWindow) {
636
652
 
637
653
  #### 新功能
638
654
 
639
- - **Window.watchChanges(窗口内容变化监听)**: 后台线程降采样对比相邻帧,超过阈值才截取完整窗口图并回调;支持 `threshold`、`from`(`window`/`screen`)、`region`、`captureSize`;返回 `WindowWatcher` `stop()`。
655
+ - **Window.watchChanges(窗口内容变化监听)**: 后台线程降采样对比相邻帧,超过阈值才触发回调;支持 `threshold`、`from`(`window`/`screen`)、`regions`(多区域,逻辑像素);返回 `WindowWatcher`,可 `stop()`、`changeOptions()` 运行时改参。
640
656
 
641
657
  ### 0.2.3
642
658
 
package/index.d.ts CHANGED
@@ -249,13 +249,6 @@ export interface CaptureImageOptions {
249
249
  */
250
250
  writeFilePath?: string | null
251
251
  }
252
- /** 截图目标尺寸(用于窗口变化监听) */
253
- export interface CaptureSizeJs {
254
- /** 目标宽度(像素) */
255
- width: number
256
- /** 目标高度(像素) */
257
- height: number
258
- }
259
252
  /** 窗口变化监听的选项 */
260
253
  export interface WindowWatchOptionsJs {
261
254
  /**
@@ -265,34 +258,52 @@ export interface WindowWatchOptionsJs {
265
258
  * - 大于 0.0 时,仅当像素变化比例超过阈值才触发回调
266
259
  */
267
260
  threshold?: number
268
- /** 图片来源:'window'(默认)或 'screen' */
269
- from?: 'window' | 'screen'
270
- /** 仅在指定区域检测变化(逻辑像素) */
271
- region?: CaptureRegion | null
272
- /** 检测到变化后传递给回调的截图目标尺寸 */
273
- captureSize?: CaptureSizeJs | null
274
261
  /**
275
- * 变化确认帧数,默认 0
262
+ * 最小变化像素数(逻辑像素),默认 0(不使用)
276
263
  *
277
- * - 0 表示检测到变化即触发回调(最快响应)
278
- * - 大于 0 时,需连续 N 帧与上一帧相比均有变化才触发回调
264
+ * - 0 表示不使用此条件,仅靠 threshold 控制
265
+ * - 大于 0 时,估算的原图逻辑像素变化数须 >= 该值才触发回调
266
+ * - 与 threshold 为 AND 关系:两者均满足时才触发
267
+ */
268
+ minChangedPixels?: number
269
+ /**
270
+ * 单像素最小通道差异(0-255),默认 30,用于过滤截图噪声
279
271
  *
280
- * 适用于过滤光标闪烁等瞬态变化:光标闪烁在 ON/OFF 间交替,
281
- * ON→OFF 一次变化、OFF→OFF 无变化则计数重置,无法连续 N 帧;
282
- * 而真实内容变化(如新消息出现)会持续与旧基线不同,
283
- * 连续 N 帧均有变化,通过确认。
284
- * 推荐 stableFrames=2 可过滤大多数光标闪烁。
272
+ * - 仅当像素的 R/G/B 任一通道差值 >= 该值才算“变化”
273
+ * - 设为 0 则任意微小差异都计入(最敏感,但噪声也会触发)
274
+ * - 设为 1 则任意像素差异都计入(精确字节比较)
285
275
  */
286
- stableFrames?: number
276
+ minPixelDiff?: number
277
+ /** 图片来源:'window'(默认)或 'screen' */
278
+ from?: 'window' | 'screen'
279
+ /** 仅在指定多个区域检测变化(逻辑像素,相对窗口);不填或空数组表示全窗口 */
280
+ regions?: Array<CaptureRegion> | null
281
+ }
282
+ /**
283
+ * 窗口内容变化回调信息
284
+ */
285
+ export interface WindowChangeInfo {
286
+ /** 降采样相邻帧对比得到的像素变化比例,约 0.0–1.0;帧尺寸不一致时为 `1` */
287
+ changeRatio: number
288
+ /** 估算的原图逻辑像素变化数;帧尺寸不一致时为 `4294967295` (u32::MAX) */
289
+ changedPixels: number
287
290
  }
288
- /** 窗口内容变化监听的回调函数签名 */
289
- export type WindowChangeCallback = () => void
291
+ /**
292
+ * 窗口内容变化回调(启动时先采一帧建基线,不调用本回调;之后仅在检测到相对上一帧的变化时调用)
293
+ * @param info 变化详情,含 `changeRatio`(变化比例)和 `changedPixels`(估算变化像素数)
294
+ */
295
+ export type WindowChangeCallback = (info: WindowChangeInfo) => void
290
296
  /** 窗口变化监听器句柄,用于停止监听 */
291
297
  export interface WindowWatcher {
292
298
  /** 停止监听,释放底层资源 */
293
299
  stop(): void
294
300
  /** 检查是否仍在运行 */
295
301
  isRunning(): boolean
302
+ /**
303
+ * 在监听过程中合并更新选项(仅传入的字段会覆盖当前值,未传的字段保持不变);
304
+ * 下一轮轮询起生效;若已调用 stop() 则抛出错误。
305
+ */
306
+ changeOptions(options: WindowWatchOptionsJs): void
296
307
  }
297
308
  /** 窗口尺寸信息 */
298
309
  export interface WindowSize {
@@ -1308,11 +1319,11 @@ export declare class Window {
1308
1319
  /**
1309
1320
  * 监听窗口内容变化,当检测到变化时触发回调函数
1310
1321
  *
1311
- * 底层使用降采样差异检测,仅在窗口内容发生变化时才触发回调,
1312
- * 资源开销远低于定时轮询截图。
1322
+ * 底层使用降采样差异检测;启动后首帧仅建立对比基线、**不**调用 callback,
1323
+ * 之后仅在相对上一帧检测到变化时才触发回调,资源开销远低于定时轮询截图。
1313
1324
  *
1314
1325
  * @param options 监听选项(可选)
1315
- * @param callback 变化时的回调函数(无参数)
1326
+ * @param callback 检测到相对上一帧有变化时的回调;参数 `changeRatio` 为降采样帧上估算的像素变化比例(约 0–1)
1316
1327
  * @returns WindowWatcher 句柄,调用 stop() 可停止监听
1317
1328
  *
1318
1329
  * @example
@@ -1320,34 +1331,38 @@ export declare class Window {
1320
1331
  * // 场景 1:监听窗口变化
1321
1332
  * const watcher = targetWindow.watchChanges(
1322
1333
  * { threshold: 0.02, from: 'window' },
1323
- * () => {
1324
- * console.log('窗口内容发生了变化');
1334
+ * (info) => {
1335
+ * console.log('窗口内容发生了变化', info.changeRatio, info.changedPixels);
1325
1336
  * }
1326
1337
  * );
1327
1338
  * ```
1328
1339
  *
1329
1340
  * @example
1330
1341
  * ```javascript
1331
- * // 场景 2:仅监听窗口的特定区域
1342
+ * // 场景 2:仅监听窗口内多个区域
1332
1343
  * const watcher = targetWindow.watchChanges(
1333
- * {
1334
- * region: { x: 100, y: 200, width: 400, height: 300 },
1344
+ * {
1345
+ * regions: [
1346
+ * { x: 100, y: 200, width: 400, height: 300 },
1347
+ * { x: 0, y: 0, width: 200, height: 80 },
1348
+ * ],
1335
1349
  * },
1336
- * () => {
1337
- * console.log('指定区域内容发生了变化');
1350
+ * (info) => {
1351
+ * console.log('指定区域内容发生了变化', info.changeRatio, info.changedPixels);
1338
1352
  * }
1339
1353
  * );
1340
1354
  * ```
1341
1355
  *
1342
1356
  * @example
1343
1357
  * ```javascript
1344
- * // 场景 3:忽略光标闪烁,仅检测真实内容变化
1358
+ * // 场景 3:提高阈值减少微小变化触发
1345
1359
  * const watcher = targetWindow.watchChanges(
1346
- * { threshold: 0.02, stableFrames: 2 },
1347
- * () => {
1348
- * console.log('窗口内容发生持久变化');
1360
+ * { threshold: 0.02 },
1361
+ * (info) => {
1362
+ * console.log('窗口内容发生持久变化', info.changeRatio);
1349
1363
  * }
1350
1364
  * );
1365
+ * watcher.changeOptions({ threshold: 0.05 });
1351
1366
  * ```
1352
1367
  */
1353
1368
  watchChanges(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rust-rpa",
3
- "version": "0.2.6-beta.2",
3
+ "version": "0.2.7",
4
4
  "description": "Rust-based RPA automation library for Node.js",
5
5
  "type": "commonjs",
6
6
  "main": "index.js",
@@ -67,9 +67,9 @@
67
67
  "commander": "^14.0.3"
68
68
  },
69
69
  "optionalDependencies": {
70
- "@alibot/rust-rpa-win32-x64-msvc": "0.2.6-beta.2",
71
- "@alibot/rust-rpa-win32-ia32-msvc": "0.2.6-beta.2",
72
- "@alibot/rust-rpa-darwin-x64": "0.2.6-beta.2",
73
- "@alibot/rust-rpa-darwin-arm64": "0.2.6-beta.2"
70
+ "@alibot/rust-rpa-win32-x64-msvc": "0.2.7",
71
+ "@alibot/rust-rpa-win32-ia32-msvc": "0.2.7",
72
+ "@alibot/rust-rpa-darwin-x64": "0.2.7",
73
+ "@alibot/rust-rpa-darwin-arm64": "0.2.7"
74
74
  }
75
75
  }