@temsmie/dsh-tool-keymouse 0.1.1 → 0.1.2

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 CHANGED
@@ -8,7 +8,7 @@ helper 已 **DPI-aware**:`GetSystemMetrics`、截图、`mouse_move` 全部统
8
8
 
9
9
  - 键盘:`key_press` / `key_up` / `key_tap`,字母数字、空格回车、F1-F12、方向键、Ctrl/Alt/Shift、Tab、Esc 等。
10
10
  - 鼠标:`mouse_press`(按住拖动)、`mouse_move`(绝对物理坐标)、`mouse_roll`(滚轮)。
11
- - 截图:`screenshot` 抓主屏保存 PNG,返回物理像素尺寸;多模态模型直接看图。
11
+ - 截图:`screenshot` 抓主屏保存 PNG,返回绝对路径与物理像素尺寸;看图能力取决于宿主环境(见「环境与能力边界」)。
12
12
  - 窗口:`get_window` / `win_rect`(查位置)、`win_find`(按进程名找窗口)、`win_activate`(唤起,含最小化/托盘)、`win_minimize` / `win_restore` / `win_maximize`、`win_top` / `release_top`(置顶)。
13
13
  - 清理:`release_all` 一键抬起所有按住项防卡键;`release_top` 取消所有置顶。
14
14
  - 自带常驻 `keymouse` 说明书(runtime skill),模型通过 skill 工具读取使用规则。
@@ -35,7 +35,7 @@ helper 已 **DPI-aware**:`GetSystemMetrics`、截图、`mouse_move` 全部统
35
35
  | `mouse_roll(up, amount?)` | up, amount? | 滚轮滚动 |
36
36
  | `release_all()` | 无 | 统一抬起全部按住项 |
37
37
 
38
- 典型组合:`win_find('QQ')` → `win_activate(hwnd)` 唤起窗口(不点图标);`key_press('ctrl')` → `key_tap('s')` → `release_all`;`mouse_press('left')` → `mouse_move(...)` → `release_all`;`screenshot()` → `read_image(path)` 看图再操作。
38
+ 典型组合:`win_find('QQ')` → `win_activate(hwnd)` 唤起窗口(不点图标);`key_press('ctrl')` → `key_tap('s')` → `release_all`;`mouse_press('left')` → `mouse_move(...)` → `release_all`;`screenshot()` →(环境支持看图时)查看图像 再定位操作。
39
39
 
40
40
  ## 安装
41
41
 
@@ -116,6 +116,16 @@ npx tsc
116
116
 
117
117
  说明:该 junction 仅用于本机编译,不在发布白名单(`files`)内,不影响打包分发。`node_modules` 已 gitignore,`bin/helper-x64.exe`(预编译、按需分发)随包提交。
118
118
 
119
+ ## 环境与能力边界
120
+
121
+ - 本插件只做三件事:模拟键鼠输入、截主屏、窗口查询/置顶。**不含识图能力**。
122
+ - `screenshot` 返回 PNG 绝对路径。能否看图由宿主环境决定:
123
+ - 当前模型支持图像输入 → 用宿主自带的读图能力打开该路径即可。
124
+ - 模型不支持图像输入 → 需环境另有视觉/OCR 能力:安装提供图像理解/OCR 的 DSH 插件,或换用支持图像输入的模型。
125
+ - 插件不依赖任何特定视觉插件或工具名;`skill` 说明书同样不假设某种识图方式存在,避免在缺该能力的环境里给出无效步骤。
126
+ - 想提升体验:用插件市场(`find_dsh_plugin`)搜 `vision` / `OCR` / `image` 等关键词安装相应插件;或直接在支持图像输入的模型下使用。
127
+ - 键鼠工具本身依赖 Windows 桌面会话(见下)。
128
+
119
129
  ## 平台
120
130
 
121
131
  仅支持 Windows(helper 使用 Win32 `SendInput`/`GetSystemMetrics`/`EnumWindows`)。DPI-aware,主屏物理像素坐标基准,单屏。
package/lib/index.js CHANGED
@@ -338,7 +338,7 @@ function apply(ctx, config = {}) {
338
338
  }));
339
339
  register(defineTool({
340
340
  name: 'screenshot',
341
- description: '截取当前主屏(全屏)保存为 PNG,返回图片路径与尺寸。之后用 read_image 读取该路径即可查看屏幕内容,再配合键鼠操作。',
341
+ description: '截取当前主屏(全屏)保存为 PNG,返回绝对路径与物理像素尺寸。本插件只提供截图,不提供识图;能否查看该图像取决于宿主环境(模型是否支持图像输入,或环境是否提供视觉/OCR 能力)。',
342
342
  parameters: {},
343
343
  output: { schema: OUTPUT_SCHEMA, render: renderScreenshot },
344
344
  async execute(_args, exec) {
@@ -1,4 +1,4 @@
1
1
  export declare const KEYMOUSE_SKILL_NAME = "keymouse";
2
2
  export declare const KEYMOUSE_SKILL_DESCRIPTION = "\u952E\u9F20\u63A7\u5236\u5DE5\u5177\uFF1A\u7528 SendInput \u6A21\u62DF\u771F\u5B9E\u952E\u76D8/\u9F20\u6807\u8F93\u5165\u3001\u622A\u5C4F\u3001\u67E5\u8BE2\u4E0E\u7F6E\u9876\u7A97\u53E3\uFF0C\u7528\u4E8E\u684C\u9762\u81EA\u52A8\u5316\uFF08\u6253\u5F00\u5E94\u7528\u3001\u767B\u5F55\u3001\u70B9\u51FB\u3001\u8F93\u5165\u3001\u62D6\u62FD\u3001\u6EDA\u52A8\u3001\u622A\u56FE\u89C2\u5BDF\u3001\u7A97\u53E3\u5B9A\u4F4D/\u7F6E\u9876\uFF09\u3002";
3
3
  export declare const KEYMOUSE_SKILL_WHEN_TO_USE = "\u4EFB\u4F55\u9700\u8981\u6A21\u62DF\u771F\u5B9E\u952E\u76D8\u6309\u4E0B/\u62AC\u8D77\u3001\u9F20\u6807\u70B9\u51FB/\u79FB\u52A8/\u6EDA\u8F6E\u3001\u8F93\u5165\u6587\u5B57\u6216\u64CD\u4F5C\u524D\u53F0\u7A97\u53E3\u7684\u81EA\u52A8\u5316\u4EFB\u52A1\u3002";
4
- export declare const KEYMOUSE_SKILL_CONTENT = "# \u952E\u9F20\u63A7\u5236\uFF08KeyMouse\uFF09\n\n\u901A\u8FC7\u5E38\u9A7B helper \u7528 SendInput \u6A21\u62DF\u771F\u5B9E\u952E\u9F20\u8F93\u5165\uFF0C\u5BF9\u5F53\u524D\u524D\u53F0\u7A97\u53E3\u751F\u6548\u3002\u6240\u6709\u5DE5\u5177\u8C03\u7528\u7ED3\u675F\u540E\u5FC5\u987B\u8DD1\u4E00\u6B21 release_all\u3002\n\n## \u5750\u6807\u4E0E\u952E\u540D\n\n- \u5750\u6807\uFF1A\u7EDD\u5BF9\u5C4F\u5E55**\u7269\u7406**\u50CF\u7D20\uFF08helper \u5DF2 DPI-aware\uFF0C\u65E0\u7F29\u653E\u6362\u7B97\uFF09\uFF0C\u4E3B\u5C4F\u5DE6\u4E0A\u89D2\u4E3A (0,0)\uFF0C\u5355\u5C4F\u3002x \u5411\u53F3\u3001y \u5411\u4E0B\u3002\u622A\u56FE\u5206\u8FA8\u7387\u5373\u7269\u7406\u50CF\u7D20\uFF0C\u8BC6\u56FE\u770B\u5230\u7684\u5750\u6807\u53EF\u76F4\u63A5\u7528\u4E8E mouse_move\uFF0C\u65E0\u9700\u6362\u7B97\u3002\n- \u952E\u540D\uFF08\u5C0F\u5199\u82F1\u6587\uFF09\uFF1A\u5B57\u6BCD `a`-`z`\u3001\u6570\u5B57 `0`-`9`\u3001`space`\u3001`enter`\u3001`tab`\u3001`esc`\u3001`backspace`\u3001`delete`\u3001`insert`\u3001`home`\u3001`end`\u3001`pageup`\u3001`pagedown`\u3001\u65B9\u5411\u952E `up`/`down`/`left`/`right`\u3001`f1`-`f12`\u3001\u4FEE\u9970\u952E `ctrl`\u3001`alt`\u3001`shift`\u3001`win`\u3001`capslock`\u3002\n- \u9F20\u6807\u6309\u94AE\uFF1A`left`\u3001`right`\u3001`middle`\u3001`x1`\u3001`x2`\u3002\n\n## \u5DE5\u5177\n\n### screenshot()\n\u622A\u53D6\u5F53\u524D\u4E3B\u5C4F\uFF08\u5168\u5C4F\uFF09\u4FDD\u5B58\u4E3A PNG\uFF0C\u8FD4\u56DE\u56FE\u7247\u8DEF\u5F84\u4E0E\u5C3A\u5BF8\u3002\u6A21\u578B\u662F\u591A\u6A21\u6001\u7684\uFF0C\u53EF\u76F4\u63A5\u770B\uFF1A\nscreenshot() \u2192 \u62FF\u5230 path \u2192 read_image(path) \u67E5\u770B\u5C4F\u5E55 \u2192 \u518D\u505A\u952E\u9F20\u64CD\u4F5C\u3002\n\n### get_window()\n\u83B7\u53D6\u5F53\u524D\u524D\u53F0\u7A97\u53E3\u4FE1\u606F\uFF1A\u7A97\u53E3\u53E5\u67C4 hwnd\u3001\u6807\u9898 title\u3001\u8FDB\u7A0B\u540D process\u3001pid\u3001\u4F4D\u7F6E (x,y,w,h)\u3002\n\u7528\u4E8E\u786E\u8BA4\u76EE\u6807\u7A97\u53E3\u3001\u62FF\u5230 hwnd \u518D\u5B9A\u4F4D\u6216\u7F6E\u9876\u3002\n\n### win_rect(hwnd?)\n\u83B7\u53D6\u7A97\u53E3\u4F4D\u7F6E\u4E0E\u5C3A\u5BF8\uFF1A\u4F20\u5165 hwnd\uFF08\u6765\u81EA get_window\uFF09\uFF0C\u4E0D\u4F20\u9ED8\u8BA4\u5F53\u524D\u524D\u53F0\u7A97\u53E3\u3002\u8FD4\u56DE x/y/w/h\u3002\n\n### win_find(process)\n\u6309\u8FDB\u7A0B\u540D\u67E5\u627E\u7A97\u53E3\uFF1A\u8FD4\u56DE\u7B2C\u4E00\u4E2A\u5339\u914D\u7684\u7A97\u53E3\u53E5\u67C4 hwnd\u3001\u6807\u9898\u3001\u8FDB\u7A0B\u3001pid\u3001visible\uFF08\u662F\u5426\u53EF\u89C1\uFF0Cfalse \u8868\u793A\u6700\u5C0F\u5316\u5230\u6258\u76D8\uFF09\u3002\u7528\u4E8E\u66FF\u4EE3\u9F20\u6807\u70B9\u4EFB\u52A1\u680F\u56FE\u6807\uFF0C\u5B9A\u4F4D\u5E76\u5524\u8D77\u67D0\u7A0B\u5E8F\u7A97\u53E3\u3002\n\u4F8B\uFF1Awin_find('QQ') \u2192 \u62FF\u5230 hwnd\uFF0C\u518D win_activate(hwnd) \u5524\u8D77 QQ \u4E3B\u7A97\u53E3\u3002\n\n### win_activate(hwnd)\n\u6FC0\u6D3B/\u524D\u7F6E\u6307\u5B9A\u7A97\u53E3\uFF1A\u81EA\u52A8\u5904\u7406\u6700\u5C0F\u5316\u4E0E\"\u6700\u5C0F\u5316\u5230\u6258\u76D8\uFF08\u9690\u85CF\uFF09\"\u4E24\u79CD\u60C5\u51B5\uFF0C\u518D\u7F6E\u524D\u53F0\u3002\u914D\u5408 win_find \u4F7F\u7528\uFF0C\u4EFB\u52A1\u7ED3\u675F\u65E0\u9700\u989D\u5916\u6E05\u7406\u3002\n\n### win_minimize(hwnd?)\n\u6700\u5C0F\u5316\u6307\u5B9A\u7A97\u53E3\uFF1A\u4F20\u5165 hwnd\uFF08\u6765\u81EA get_window\uFF09\uFF0C\u4E0D\u4F20\u9ED8\u8BA4\u5F53\u524D\u524D\u53F0\u7A97\u53E3\u3002\n\n### win_restore(hwnd?)\n\u8FD8\u539F\u6307\u5B9A\u7A97\u53E3\uFF1A\u4ECE\u6700\u5C0F\u5316\u6216\u6700\u5927\u5316\u8FD8\u539F\u5230\u4E4B\u524D\u5927\u5C0F\u3002\u4E0D\u4F20\u9ED8\u8BA4\u5F53\u524D\u524D\u53F0\u7A97\u53E3\u3002\n\n### win_maximize(hwnd?)\n\u6700\u5927\u5316\u6307\u5B9A\u7A97\u53E3\u3002\u4E0D\u4F20\u9ED8\u8BA4\u5F53\u524D\u524D\u53F0\u7A97\u53E3\u3002\n\n### win_top(hwnd, on)\n\u7F6E\u9876\uFF08true\uFF09/\u53D6\u6D88\u7F6E\u9876\uFF08false\uFF09\u6307\u5B9A\u7A97\u53E3\u3002\u7F6E\u9876\u540E\u7A97\u53E3\u5E38\u9A7B\u6700\u524D\u3002\u4EFB\u52A1\u7ED3\u675F\u5FC5\u987B\u7EDF\u4E00 release_top \u53D6\u6D88\u3002\n\n### release_top()\n\u53D6\u6D88\u6240\u6709\u672C\u63D2\u4EF6\u7F6E\u9876\u8FC7\u7684\u7A97\u53E3\uFF0C\u6062\u590D\u9ED8\u8BA4\u5C42\u7EA7\u3002\u4EFB\u52A1\u7ED3\u675F\u65F6\u5FC5\u987B\u8C03\u7528\u4E00\u6B21\u3002\n\n### key_tap(key)\n\u6309\u4E0B\u5E76\u7ACB\u523B\u62AC\u8D77\u5355\u4E2A\u952E\uFF08\u5355\u4E2A\u52A8\u4F5C\uFF0C\u4E0D\u5361\u952E\uFF09\u3002\u7528\u4E8E\u70B9\u6309\u3001\u8F93\u5165\u5355\u5B57\u7B26\u6216\u5355\u4E2A\u5FEB\u6377\u952E\u6309\u952E\u3002\n\u4F8B\uFF1Akey_tap('enter') \u786E\u8BA4\uFF1Bkey_tap('space') \u7FFB\u9875\u3002\n\n### key_press(key)\n\u53EA\u6309\u4E0B\u67D0\u952E\u3001\u4E0D\u62AC\u8D77\u3002\u7528\u4E8E\u7EC4\u5408\u952E\uFF1A\u5148 key_press('ctrl')\uFF0C\u518D\u6309\u5176\u4ED6\u952E\uFF0C\u6700\u540E release_all\u3002\n\u6CE8\u610F\uFF1A\u5FC5\u987B\u914D\u5408 release_all \u62AC\u8D77\uFF0C\u5426\u5219\u952E\u4F1A\u4E00\u76F4\u6309\u4F4F\u3002\n\n### key_up(key)\n\u62AC\u8D77\u67D0\u952E\u3002\n\n### mouse_press(button)\n\u53EA\u6309\u4E0B\u9F20\u6807\u6309\u94AE\u3001\u4E0D\u62AC\u8D77\u3002\u7528\u4E8E\u6309\u4F4F\u5DE6\u952E\u62D6\u52A8\uFF1Amouse_press('left') \u2192 mouse_move(...) \u2192 release_all\u3002\n\n### mouse_move(x,y)\n\u628A\u9F20\u6807\u7EDD\u5BF9\u79FB\u52A8\u5230\u5C4F\u5E55\u5750\u6807 (x,y)\u3002\n\n### mouse_roll(up)\n\u6EDA\u52A8\u9F20\u6807\u6EDA\u8F6E\uFF1Aup \u4E3A true \u6EDA\u4E0A\u3001false \u6EDA\u4E0B\u3002\n\n### release_all()\n\u62AC\u8D77\u6240\u6709\u4ECD\u88AB\u6309\u4F4F\u7684\u952E\u4E0E\u9F20\u6807\u6309\u94AE\u3002\u6BCF\u6B21\u952E\u9F20\u64CD\u4F5C\u7ED3\u675F\u540E\u5FC5\u987B\u8C03\u7528\u4E00\u6B21\uFF0C\u907F\u514D\u5361\u952E\u3002\n\n## \u8FD4\u56DE\n\n\u6BCF\u4E2A\u5DE5\u5177\u8FD4\u56DE ok=true \u8868\u793A\u8BE5\u547D\u4EE4\u5DF2\u4EA4\u7ED9\u7CFB\u7EDF\uFF1B\u8FD4\u56DE error \u8868\u793A\u53C2\u6570\u6216\u952E\u540D\u4E0D\u5408\u6CD5\u3002screenshot \u8FD8\u8FD4\u56DE path\uFF08PNG \u7EDD\u5BF9\u8DEF\u5F84\uFF09\u3001width/height\uFF08\u50CF\u7D20\u5C3A\u5BF8\uFF09\u3002win_find \u8FD8\u8FD4\u56DE hwnd\u3001title\u3001process\u3001pid\u3001visible\u3001x/y/w/h\u3002\n\n## \u5178\u578B\u7EC4\u5408\n\n- Ctrl+S \u4FDD\u5B58\uFF1Akey_press('ctrl')\uFF1Bkey_tap('s')\uFF1Brelease_all\u3002\n- Ctrl+O \u6253\u5F00\uFF1Akey_press('ctrl')\uFF1Bkey_tap('o')\uFF1Brelease_all\u3002\n- \u5DE6\u952E\u62D6\u62FD\uFF1Amouse_press('left')\uFF1Bmouse_move(x2,y2)\uFF1Bmouse_move(x1,y1)\uFF1Brelease_all\u3002\n- \u6EDA\u5230\u9875\u9762\u5E95\u90E8\uFF1Amouse_roll(false)\uFF1Bmouse_roll(false)\uFF1B\u2026\uFF08\u53EF\u591A\u6B21\uFF09\u3002\n- \u89C6\u89C9\u95ED\u73AF\uFF1Ascreenshot() \u5F97 path \u2192 read_image(path) \u770B\u5C4F\u5E55 \u2192 \u952E\u9F20\u64CD\u4F5C\u3002\n- \u5524\u8D77\u7A0B\u5E8F\u7A97\u53E3\uFF08\u4E0D\u70B9\u56FE\u6807\uFF09\uFF1Awin_find('QQ') \u2192 win_activate(hwnd) \u2192 \u524D\u53F0\u51FA\u73B0 QQ \u4E3B\u7A97\u53E3\uFF08\u6258\u76D8\u9690\u85CF/\u6700\u5C0F\u5316\u4E5F\u80FD\u5524\u56DE\uFF09\u3002\n\n## \u89C4\u8303\n\n1. \u64CD\u4F5C\u524D\u5148\u786E\u8BA4\u76EE\u6807\u7A97\u53E3\u4E0E\u9F20\u6807\u4F4D\u7F6E\uFF08\u53EF\u5148 mouse_move \u518D\u89C2\u5BDF\u7ED3\u679C\uFF09\u3002\n2. \u7528\u7EC4\u5408\u952E/\u6309\u4F4F\u540E\uFF0C\u7ED3\u675F\u7EDF\u4E00\u8C03\u7528 release_all\u3002\n3. \u7F6E\u9876\u7A97\u53E3\u540E\uFF0C\u4EFB\u52A1\u7ED3\u675F\u7EDF\u4E00\u8C03\u7528 release_top \u53D6\u6D88\u3002\n4. \u5DE5\u5177\u503C\u662F\u5373\u65F6\u7684\uFF1ASendInput \u5FAE\u79D2\u7EA7\u751F\u6548\uFF0C\u4E0D\u9700\u8981\u7B49\u5F85\u3002\n";
4
+ export declare const KEYMOUSE_SKILL_CONTENT = "# \u952E\u9F20\u63A7\u5236\uFF08KeyMouse\uFF09\n\n\u901A\u8FC7\u5E38\u9A7B helper \u7528 SendInput \u6A21\u62DF\u771F\u5B9E\u952E\u9F20\u8F93\u5165\uFF0C\u5BF9\u5F53\u524D\u524D\u53F0\u7A97\u53E3\u751F\u6548\u3002\u6240\u6709\u5DE5\u5177\u8C03\u7528\u7ED3\u675F\u540E\u5FC5\u987B\u8DD1\u4E00\u6B21 release_all\u3002\n\n## \u5750\u6807\u4E0E\u952E\u540D\n\n- \u5750\u6807\uFF1A\u7EDD\u5BF9\u5C4F\u5E55**\u7269\u7406**\u50CF\u7D20\uFF08helper \u5DF2 DPI-aware\uFF0C\u65E0\u7F29\u653E\u6362\u7B97\uFF09\uFF0C\u4E3B\u5C4F\u5DE6\u4E0A\u89D2\u4E3A (0,0)\uFF0C\u5355\u5C4F\u3002x \u5411\u53F3\u3001y \u5411\u4E0B\u3002\u622A\u56FE\u5206\u8FA8\u7387\u5373\u7269\u7406\u50CF\u7D20\uFF0C\u4ECE\u56FE\u50CF\u4E2D\u8BFB\u5230\u7684\u5750\u6807\u53EF\u76F4\u63A5\u7528\u4E8E mouse_move\uFF0C\u65E0\u9700\u6362\u7B97\u3002\n- \u952E\u540D\uFF08\u5C0F\u5199\u82F1\u6587\uFF09\uFF1A\u5B57\u6BCD `a`-`z`\u3001\u6570\u5B57 `0`-`9`\u3001`space`\u3001`enter`\u3001`tab`\u3001`esc`\u3001`backspace`\u3001`delete`\u3001`insert`\u3001`home`\u3001`end`\u3001`pageup`\u3001`pagedown`\u3001\u65B9\u5411\u952E `up`/`down`/`left`/`right`\u3001`f1`-`f12`\u3001\u4FEE\u9970\u952E `ctrl`\u3001`alt`\u3001`shift`\u3001`win`\u3001`capslock`\u3002\n- \u9F20\u6807\u6309\u94AE\uFF1A`left`\u3001`right`\u3001`middle`\u3001`x1`\u3001`x2`\u3002\n\n## \u5DE5\u5177\n\n### screenshot()\n\u622A\u53D6\u5F53\u524D\u4E3B\u5C4F\uFF08\u5168\u5C4F\uFF09\u4FDD\u5B58\u4E3A PNG\uFF0C\u8FD4\u56DE\u7EDD\u5BF9\u8DEF\u5F84 path \u4E0E\u7269\u7406\u50CF\u7D20\u5C3A\u5BF8 width/height\u3002\n\u672C\u63D2\u4EF6\u53EA\u8D1F\u8D23\u622A\u56FE\uFF0C\u4E0D\u63D0\u4F9B\u8BC6\u56FE\uFF1B\u80FD\u5426\u770B\u56FE\u53D6\u51B3\u4E8E\u5BBF\u4E3B\u73AF\u5883\uFF1A\u6A21\u578B\u652F\u6301\u56FE\u50CF\u8F93\u5165\u65F6\u53EF\u7528\u5BBF\u4E3B\u7684\u8BFB\u56FE\u80FD\u529B\u6253\u5F00\u8BE5 path\uFF0C\u5426\u5219\u9700\u73AF\u5883\u53E6\u6709\u89C6\u89C9/OCR \u80FD\u529B\u6216\u6362\u7528\u652F\u6301\u56FE\u50CF\u8F93\u5165\u7684\u6A21\u578B\u3002\n\n### get_window()\n\u83B7\u53D6\u5F53\u524D\u524D\u53F0\u7A97\u53E3\u4FE1\u606F\uFF1A\u7A97\u53E3\u53E5\u67C4 hwnd\u3001\u6807\u9898 title\u3001\u8FDB\u7A0B\u540D process\u3001pid\u3001\u4F4D\u7F6E (x,y,w,h)\u3002\n\u7528\u4E8E\u786E\u8BA4\u76EE\u6807\u7A97\u53E3\u3001\u62FF\u5230 hwnd \u518D\u5B9A\u4F4D\u6216\u7F6E\u9876\u3002\n\n### win_rect(hwnd?)\n\u83B7\u53D6\u7A97\u53E3\u4F4D\u7F6E\u4E0E\u5C3A\u5BF8\uFF1A\u4F20\u5165 hwnd\uFF08\u6765\u81EA get_window\uFF09\uFF0C\u4E0D\u4F20\u9ED8\u8BA4\u5F53\u524D\u524D\u53F0\u7A97\u53E3\u3002\u8FD4\u56DE x/y/w/h\u3002\n\n### win_find(process)\n\u6309\u8FDB\u7A0B\u540D\u67E5\u627E\u7A97\u53E3\uFF1A\u8FD4\u56DE\u7B2C\u4E00\u4E2A\u5339\u914D\u7684\u7A97\u53E3\u53E5\u67C4 hwnd\u3001\u6807\u9898\u3001\u8FDB\u7A0B\u3001pid\u3001visible\uFF08\u662F\u5426\u53EF\u89C1\uFF0Cfalse \u8868\u793A\u6700\u5C0F\u5316\u5230\u6258\u76D8\uFF09\u3002\u7528\u4E8E\u66FF\u4EE3\u9F20\u6807\u70B9\u4EFB\u52A1\u680F\u56FE\u6807\uFF0C\u5B9A\u4F4D\u5E76\u5524\u8D77\u67D0\u7A0B\u5E8F\u7A97\u53E3\u3002\n\u4F8B\uFF1Awin_find('QQ') \u2192 \u62FF\u5230 hwnd\uFF0C\u518D win_activate(hwnd) \u5524\u8D77 QQ \u4E3B\u7A97\u53E3\u3002\n\n### win_activate(hwnd)\n\u6FC0\u6D3B/\u524D\u7F6E\u6307\u5B9A\u7A97\u53E3\uFF1A\u81EA\u52A8\u5904\u7406\u6700\u5C0F\u5316\u4E0E\"\u6700\u5C0F\u5316\u5230\u6258\u76D8\uFF08\u9690\u85CF\uFF09\"\u4E24\u79CD\u60C5\u51B5\uFF0C\u518D\u7F6E\u524D\u53F0\u3002\u914D\u5408 win_find \u4F7F\u7528\uFF0C\u4EFB\u52A1\u7ED3\u675F\u65E0\u9700\u989D\u5916\u6E05\u7406\u3002\n\n### win_minimize(hwnd?)\n\u6700\u5C0F\u5316\u6307\u5B9A\u7A97\u53E3\uFF1A\u4F20\u5165 hwnd\uFF08\u6765\u81EA get_window\uFF09\uFF0C\u4E0D\u4F20\u9ED8\u8BA4\u5F53\u524D\u524D\u53F0\u7A97\u53E3\u3002\n\n### win_restore(hwnd?)\n\u8FD8\u539F\u6307\u5B9A\u7A97\u53E3\uFF1A\u4ECE\u6700\u5C0F\u5316\u6216\u6700\u5927\u5316\u8FD8\u539F\u5230\u4E4B\u524D\u5927\u5C0F\u3002\u4E0D\u4F20\u9ED8\u8BA4\u5F53\u524D\u524D\u53F0\u7A97\u53E3\u3002\n\n### win_maximize(hwnd?)\n\u6700\u5927\u5316\u6307\u5B9A\u7A97\u53E3\u3002\u4E0D\u4F20\u9ED8\u8BA4\u5F53\u524D\u524D\u53F0\u7A97\u53E3\u3002\n\n### win_top(hwnd, on)\n\u7F6E\u9876\uFF08true\uFF09/\u53D6\u6D88\u7F6E\u9876\uFF08false\uFF09\u6307\u5B9A\u7A97\u53E3\u3002\u7F6E\u9876\u540E\u7A97\u53E3\u5E38\u9A7B\u6700\u524D\u3002\u4EFB\u52A1\u7ED3\u675F\u5FC5\u987B\u7EDF\u4E00 release_top \u53D6\u6D88\u3002\n\n### release_top()\n\u53D6\u6D88\u6240\u6709\u672C\u63D2\u4EF6\u7F6E\u9876\u8FC7\u7684\u7A97\u53E3\uFF0C\u6062\u590D\u9ED8\u8BA4\u5C42\u7EA7\u3002\u4EFB\u52A1\u7ED3\u675F\u65F6\u5FC5\u987B\u8C03\u7528\u4E00\u6B21\u3002\n\n### key_tap(key)\n\u6309\u4E0B\u5E76\u7ACB\u523B\u62AC\u8D77\u5355\u4E2A\u952E\uFF08\u5355\u4E2A\u52A8\u4F5C\uFF0C\u4E0D\u5361\u952E\uFF09\u3002\u7528\u4E8E\u70B9\u6309\u3001\u8F93\u5165\u5355\u5B57\u7B26\u6216\u5355\u4E2A\u5FEB\u6377\u952E\u6309\u952E\u3002\n\u4F8B\uFF1Akey_tap('enter') \u786E\u8BA4\uFF1Bkey_tap('space') \u7FFB\u9875\u3002\n\n### key_press(key)\n\u53EA\u6309\u4E0B\u67D0\u952E\u3001\u4E0D\u62AC\u8D77\u3002\u7528\u4E8E\u7EC4\u5408\u952E\uFF1A\u5148 key_press('ctrl')\uFF0C\u518D\u6309\u5176\u4ED6\u952E\uFF0C\u6700\u540E release_all\u3002\n\u6CE8\u610F\uFF1A\u5FC5\u987B\u914D\u5408 release_all \u62AC\u8D77\uFF0C\u5426\u5219\u952E\u4F1A\u4E00\u76F4\u6309\u4F4F\u3002\n\n### key_up(key)\n\u62AC\u8D77\u67D0\u952E\u3002\n\n### mouse_press(button)\n\u53EA\u6309\u4E0B\u9F20\u6807\u6309\u94AE\u3001\u4E0D\u62AC\u8D77\u3002\u7528\u4E8E\u6309\u4F4F\u5DE6\u952E\u62D6\u52A8\uFF1Amouse_press('left') \u2192 mouse_move(...) \u2192 release_all\u3002\n\n### mouse_move(x,y)\n\u628A\u9F20\u6807\u7EDD\u5BF9\u79FB\u52A8\u5230\u5C4F\u5E55\u5750\u6807 (x,y)\u3002\n\n### mouse_roll(up)\n\u6EDA\u52A8\u9F20\u6807\u6EDA\u8F6E\uFF1Aup \u4E3A true \u6EDA\u4E0A\u3001false \u6EDA\u4E0B\u3002\n\n### release_all()\n\u62AC\u8D77\u6240\u6709\u4ECD\u88AB\u6309\u4F4F\u7684\u952E\u4E0E\u9F20\u6807\u6309\u94AE\u3002\u6BCF\u6B21\u952E\u9F20\u64CD\u4F5C\u7ED3\u675F\u540E\u5FC5\u987B\u8C03\u7528\u4E00\u6B21\uFF0C\u907F\u514D\u5361\u952E\u3002\n\n## \u8FD4\u56DE\n\n\u6BCF\u4E2A\u5DE5\u5177\u8FD4\u56DE ok=true \u8868\u793A\u8BE5\u547D\u4EE4\u5DF2\u4EA4\u7ED9\u7CFB\u7EDF\uFF1B\u8FD4\u56DE error \u8868\u793A\u53C2\u6570\u6216\u952E\u540D\u4E0D\u5408\u6CD5\u3002screenshot \u8FD8\u8FD4\u56DE path\uFF08PNG \u7EDD\u5BF9\u8DEF\u5F84\uFF09\u3001width/height\uFF08\u50CF\u7D20\u5C3A\u5BF8\uFF09\u3002win_find \u8FD8\u8FD4\u56DE hwnd\u3001title\u3001process\u3001pid\u3001visible\u3001x/y/w/h\u3002\n\n## \u5178\u578B\u7EC4\u5408\n\n- Ctrl+S \u4FDD\u5B58\uFF1Akey_press('ctrl')\uFF1Bkey_tap('s')\uFF1Brelease_all\u3002\n- Ctrl+O \u6253\u5F00\uFF1Akey_press('ctrl')\uFF1Bkey_tap('o')\uFF1Brelease_all\u3002\n- \u5DE6\u952E\u62D6\u62FD\uFF1Amouse_press('left')\uFF1Bmouse_move(x2,y2)\uFF1Bmouse_move(x1,y1)\uFF1Brelease_all\u3002\n- \u6EDA\u5230\u9875\u9762\u5E95\u90E8\uFF1Amouse_roll(false)\uFF1Bmouse_roll(false)\uFF1B\u2026\uFF08\u53EF\u591A\u6B21\uFF09\u3002\n- \u622A\u56FE\u5B9A\u4F4D\uFF1Ascreenshot() \u5F97 path \u2192\uFF08\u73AF\u5883\u652F\u6301\u770B\u56FE\u65F6\uFF09\u67E5\u770B\u5C4F\u5E55 \u2192 \u636E\u6B64 mouse_move \u5B9A\u4F4D\u3002\n- \u5524\u8D77\u7A0B\u5E8F\u7A97\u53E3\uFF08\u4E0D\u70B9\u56FE\u6807\uFF09\uFF1Awin_find('QQ') \u2192 win_activate(hwnd) \u2192 \u524D\u53F0\u51FA\u73B0 QQ \u4E3B\u7A97\u53E3\uFF08\u6258\u76D8\u9690\u85CF/\u6700\u5C0F\u5316\u4E5F\u80FD\u5524\u56DE\uFF09\u3002\n\n## \u89C4\u8303\n\n1. \u64CD\u4F5C\u524D\u5148\u786E\u8BA4\u76EE\u6807\u7A97\u53E3\u4E0E\u9F20\u6807\u4F4D\u7F6E\uFF08\u53EF\u5148 mouse_move \u518D\u89C2\u5BDF\u7ED3\u679C\uFF09\u3002\n2. \u7528\u7EC4\u5408\u952E/\u6309\u4F4F\u540E\uFF0C\u7ED3\u675F\u7EDF\u4E00\u8C03\u7528 release_all\u3002\n3. \u7F6E\u9876\u7A97\u53E3\u540E\uFF0C\u4EFB\u52A1\u7ED3\u675F\u7EDF\u4E00\u8C03\u7528 release_top \u53D6\u6D88\u3002\n4. \u5DE5\u5177\u503C\u662F\u5373\u65F6\u7684\uFF1ASendInput \u5FAE\u79D2\u7EA7\u751F\u6548\uFF0C\u4E0D\u9700\u8981\u7B49\u5F85\u3002\n";
@@ -10,15 +10,15 @@ export const KEYMOUSE_SKILL_CONTENT = `# 键鼠控制(KeyMouse)
10
10
 
11
11
  ## 坐标与键名
12
12
 
13
- - 坐标:绝对屏幕**物理**像素(helper 已 DPI-aware,无缩放换算),主屏左上角为 (0,0),单屏。x 向右、y 向下。截图分辨率即物理像素,识图看到的坐标可直接用于 mouse_move,无需换算。
13
+ - 坐标:绝对屏幕**物理**像素(helper 已 DPI-aware,无缩放换算),主屏左上角为 (0,0),单屏。x 向右、y 向下。截图分辨率即物理像素,从图像中读到的坐标可直接用于 mouse_move,无需换算。
14
14
  - 键名(小写英文):字母 \`a\`-\`z\`、数字 \`0\`-\`9\`、\`space\`、\`enter\`、\`tab\`、\`esc\`、\`backspace\`、\`delete\`、\`insert\`、\`home\`、\`end\`、\`pageup\`、\`pagedown\`、方向键 \`up\`/\`down\`/\`left\`/\`right\`、\`f1\`-\`f12\`、修饰键 \`ctrl\`、\`alt\`、\`shift\`、\`win\`、\`capslock\`。
15
15
  - 鼠标按钮:\`left\`、\`right\`、\`middle\`、\`x1\`、\`x2\`。
16
16
 
17
17
  ## 工具
18
18
 
19
19
  ### screenshot()
20
- 截取当前主屏(全屏)保存为 PNG,返回图片路径与尺寸。模型是多模态的,可直接看:
21
- screenshot() → 拿到 path → read_image(path) 查看屏幕 → 再做键鼠操作。
20
+ 截取当前主屏(全屏)保存为 PNG,返回绝对路径 path 与物理像素尺寸 width/height。
21
+ 本插件只负责截图,不提供识图;能否看图取决于宿主环境:模型支持图像输入时可用宿主的读图能力打开该 path,否则需环境另有视觉/OCR 能力或换用支持图像输入的模型。
22
22
 
23
23
  ### get_window()
24
24
  获取当前前台窗口信息:窗口句柄 hwnd、标题 title、进程名 process、pid、位置 (x,y,w,h)。
@@ -82,7 +82,7 @@ screenshot() → 拿到 path → read_image(path) 查看屏幕 → 再做键鼠
82
82
  - Ctrl+O 打开:key_press('ctrl');key_tap('o');release_all。
83
83
  - 左键拖拽:mouse_press('left');mouse_move(x2,y2);mouse_move(x1,y1);release_all。
84
84
  - 滚到页面底部:mouse_roll(false);mouse_roll(false);…(可多次)。
85
- - 视觉闭环:screenshot() 得 path → read_image(path) 看屏幕 → 键鼠操作。
85
+ - 截图定位:screenshot() 得 path →(环境支持看图时)查看屏幕 据此 mouse_move 定位。
86
86
  - 唤起程序窗口(不点图标):win_find('QQ') → win_activate(hwnd) → 前台出现 QQ 主窗口(托盘隐藏/最小化也能唤回)。
87
87
 
88
88
  ## 规范
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@temsmie/dsh-tool-keymouse",
3
3
  "description": "Windows key/mouse/screenshot/window automation (SendInput over a persistent helper) for the DeepSeek Harness",
4
- "version": "0.1.1",
4
+ "version": "0.1.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -4,15 +4,15 @@
4
4
 
5
5
  ## 坐标与键名
6
6
 
7
- - 坐标:绝对屏幕**物理**像素(helper 已 DPI-aware,无缩放换算),主屏左上角为 (0,0),单屏。x 向右、y 向下。截图分辨率即物理像素,识图看到的坐标可直接用于 mouse_move,无需换算。
7
+ - 坐标:绝对屏幕**物理**像素(helper 已 DPI-aware,无缩放换算),主屏左上角为 (0,0),单屏。x 向右、y 向下。截图分辨率即物理像素,从图像中读到的坐标可直接用于 mouse_move,无需换算。
8
8
  - 键名(小写英文):字母 `a`-`z`、数字 `0`-`9`、`space`、`enter`、`tab`、`esc`、`backspace`、`delete`、`insert`、`home`、`end`、`pageup`、`pagedown`、方向键 `up`/`down`/`left`/`right`、`f1`-`f12`、修饰键 `ctrl`、`alt`、`shift`、`win`、`capslock`。
9
9
  - 鼠标按钮:`left`、`right`、`middle`、`x1`、`x2`。
10
10
 
11
11
  ## 工具
12
12
 
13
13
  ### screenshot()
14
- 截取当前主屏(全屏)保存为 PNG,返回图片路径与尺寸。模型是多模态的,可直接看:
15
- screenshot() → 拿到 path → read_image(path) 查看屏幕 → 再做键鼠操作。
14
+ 截取当前主屏(全屏)保存为 PNG,返回绝对路径 path 与物理像素尺寸 width/height。
15
+ 本插件只负责截图,不提供识图;能否看图取决于宿主环境:模型支持图像输入时可用宿主的读图能力打开该 path,否则需环境另有视觉/OCR 能力或换用支持图像输入的模型。
16
16
 
17
17
  ### get_window()
18
18
  获取当前前台窗口信息:窗口句柄 hwnd、标题 title、进程名 process、pid、位置 (x,y,w,h)。
@@ -76,7 +76,7 @@ screenshot() → 拿到 path → read_image(path) 查看屏幕 → 再做键鼠
76
76
  - Ctrl+O 打开:key_press('ctrl');key_tap('o');release_all。
77
77
  - 左键拖拽:mouse_press('left');mouse_move(x2,y2);mouse_move(x1,y1);release_all。
78
78
  - 滚到页面底部:mouse_roll(false);mouse_roll(false);…(可多次)。
79
- - 视觉闭环:screenshot() 得 path → read_image(path) 看屏幕 → 键鼠操作。
79
+ - 截图定位:screenshot() 得 path →(环境支持看图时)查看屏幕 据此 mouse_move 定位。
80
80
  - 唤起程序窗口(不点图标):win_find('QQ') → win_activate(hwnd) → 前台出现 QQ 主窗口(托盘隐藏/最小化也能唤回)。
81
81
 
82
82
  ## 规范