fix: 图片路径类字段屏幕框选改为存模板截图路径, 仅搜索区域字段存区域JSON

This commit is contained in:
yu 2026-11-03 10:54:35 +08:00
parent 0960be88e5
commit 52423d46a4

View File

@ -609,13 +609,17 @@ function FieldControl({
setPicking(true);
try {
const region = await window.rpa.desktop.pickRegion();
if (field.widget === "region") {
// 只有「搜索区域」类字段(displayType=region, 如 CV_* 的 searchRegion)存区域坐标 JSON;
// 「屏幕截图」类字段(displayType=screenShot, 如 Image_* 的图片路径)是把截好的图当模板图用,
// 运行时按文件路径打开该值——存 JSON 会直接 ENOENT, 所以这里存截图落盘后的路径
const wantsRegionJson = field.widget === "region" && field.displayType !== "screenShot";
if (wantsRegionJson) {
// region 字段存完整信息: 坐标+尺寸+截图路径, 运行时可据此定位区域内容在屏幕上的绝对位置
onChange(field.key, JSON.stringify({ x: region.x, y: region.y, width: region.width, height: region.height, imagePath: region.imagePath }));
onToast("已框选区域:" + region.width + "×" + region.height + " @(" + region.x + "," + region.y + ")");
} else {
onChange(field.key, region.imagePath);
onToast("已框选并截图:" + region.width + "×" + region.height);
onToast("已截取模板图片:" + region.width + "×" + region.height);
}
} catch (error) {
onToast(error instanceof Error ? error.message : String(error), "error");
@ -670,7 +674,9 @@ function FieldControl({
: field.widget === "folder"
? "填写完整文件夹路径,或点右侧按钮选择"
: field.widget === "region"
? "填写区域坐标 JSON,或点「屏幕框选」生成"
? field.displayType === "screenShot"
? "填模板图片路径,或点「屏幕框选」截取屏幕上的目标图案"
: "填写区域坐标 JSON,或点「屏幕框选」生成"
: "";
const hint = field.description || fallbackHint;
@ -772,6 +778,23 @@ function FieldControl({
placeholder={field.placeholder || ""}
onChange={(event) => onChange(field.key, event.target.value)}
/>
) : field.widget === "region" && field.displayType === "screenShot" ? (
// 模板图片类字段(Image_* 的图片路径等): 值是文件路径, 框选是把截图存盘后填路径
<div className="field-row">
<input
className="text-input"
value={textOf(raw)}
placeholder={field.placeholder || "填模板图片路径,或点「屏幕框选」截取"}
onChange={(event) => onChange(field.key, event.target.value)}
/>
<VarMenu variables={variables} onPick={insertVariable} />
<button type="button" className="mini-btn" onClick={() => void pickPath(false)} title="浏览">
<FolderOpen className="icon" style={{ width: 13, height: 13 }} />
</button>
<button type="button" className="mini-btn" disabled={picking} onClick={() => void pickRegionToField()} title="截取屏幕区域作为模板图片">
{picking ? "框选中" : "屏幕框选"}
</button>
</div>
) : field.widget === "region" ? (
<div className="field-row">
<input