diff --git a/src/renderer/src/panels/Properties.tsx b/src/renderer/src/panels/Properties.tsx index 149baa2..cc28ca0 100644 --- a/src/renderer/src/panels/Properties.tsx +++ b/src/renderer/src/panels/Properties.tsx @@ -443,8 +443,10 @@ function FieldControl({ }) { const raw = node.values[field.key] ?? field.defaultValue; const [picking, setPicking] = useState(false); - const isVisionTarget = /^(OcrOffline_|CV_)/.test(node.componentId); + const isGroundTarget = node.componentId.endsWith("Ground"); + const isVisionSource = /^(OcrOffline_|CV_|Image_)/.test(node.componentId); const isWindowTarget = /^(Window_|System_ConnectRemoteDesktop)/.test(node.componentId); + const isVisionTarget = /^(OcrOffline_|CV_)/.test(node.componentId); const insertVariable = (expression: string) => { const current = textOf(raw).trim(); @@ -452,6 +454,23 @@ function FieldControl({ onChange(field.key, current === "" || known ? expression : `${textOf(raw)}${expression}`); }; + const pickDesktop = async () => { + setPicking(true); + try { + const picked = await window.rpa.desktop.pickElement(); + if (picked.cancelled) { + onToast("已取消拾取"); + return; + } + onChange(field.key, picked.selector); + onToast("已拾取:" + (picked.name || picked.controlType || "元素")); + } catch (error) { + onToast(error instanceof Error ? error.message : String(error), "error"); + } finally { + setPicking(false); + } + }; + const pickPath = async (directories: boolean) => { try { const selected = await window.rpa.dialog.open({ @@ -616,9 +635,15 @@ function FieldControl({ placeholder="css:#submit / aria:button" onChange={(event) => onChange(field.key, event.target.value)} /> - + )} ) : field.widget === "secret" ? (