# MouseClick **Repository Path**: egmkang/MouseClick ## Basic Information - **Project Name**: MouseClick - **Description**: 实打实大是的是的萨达撒大声地 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-05 - **Last Updated**: 2026-10-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MouseClick 录制连点器 这是一个 .NET 10 WinForms 小工具,用来按窗口标题关键字定位游戏窗口,录制窗口内点击,并以相对窗口百分比坐标保存为 TXT 脚本。 ## 运行 ```powershell dotnet run ``` ## 发布单文件 AOT 直接运行目录下的 `publish-aot.bat`(双击,或在命令行里执行): ```powershell publish-aot.bat # 发布结束后暂停,方便看结果 publish-aot.bat -q # 不暂停,适合命令行/CI ``` 脚本内部执行的就是下面这条命令;随后会把 CBT Hook DLL 追加到 exe 尾部(单 exe 分发),结束后只保留 exe 和 pdb: ```powershell dotnet publish -p:PublishProfile=win-x64-aot ``` 输出目录: ```txt bin\Release\net10.0-windows\win-x64\publish-aot\MouseClick.exe ``` `MouseClick.exe` 是 Native AOT 程序(约 21 MB,已内嵌 CBT Hook DLL),运行时不需要装 .NET,分发时只需要这一个 exe;旁边的 `MouseClick.pdb` 是调试符号文件,可以不一起分发。 前置条件:AOT 需要 MSVC 链接器,请先安装 “Visual Studio Build Tools” 并勾选 “使用 C++ 的桌面开发” 工作负载。由于 WinForms 需要显式绕过裁剪保护才能 Native AOT 发布,编译过程会出现 WinForms AOT 分析警告,属正常现象;发布后的 exe 需要实际点一遍录制和回放流程。 ## 使用流程 1. 在“窗口标题关键字”里输入游戏窗口标题的一部分,例如 `造化仙府`。 2. 设置“循环次数”,表示回放时整套步骤重复执行几遍。 3. 点击固定使用窗口消息,不移动系统鼠标。 4. 设置“循环间隔(秒)”,表示每轮循环开始时间之间的间隔;这个间隔从上一轮开始时算起。 5. 点击“查找窗口”,确认找到了正确窗口;如果有多个同名窗口,会弹出列表让你按句柄选择一个,并在本次运行中锁定该窗口。 6. 点击“开始录制”,然后在游戏窗口内按顺序点击。 7. 点击“停止录制”,检查步骤列表。 8. 点击“保存 TXT”保存脚本,或“加载 TXT”读取旧脚本。 9. 点击“回放脚本”时,程序会重新按关键字查找当前窗口位置,再按百分比坐标点击。回放路径不再弹“选择目标窗口”:锁定句柄失效时,按上次选择的 PID 静默复用;找不到对应实例就提示先点“查找窗口”,不会自己抢焦点。 ## 脚本格式 ```txt # MouseClick Script v1 window=造化仙府 clickMode=WindowMessage loop=3 loopIntervalSeconds=60 targetPid=101004 # step format: click wait= x=<0-1 percent> y=<0-1 percent> note= click wait=1000 x=0.850000 y=0.670000 note=screen=500,400 click wait=1500 x=0.420000 y=0.910000 note=screen=260,540 ``` `x` 和 `y` 是相对目标窗口矩形的百分比,窗口位置变化后仍会按当前窗口大小换算成屏幕坐标。 `clickMode` 固定为 `WindowMessage`(旧脚本里的其他值仍能加载,但不会使用系统鼠标)。 `loop` 是回放循环次数,旧脚本没有这一行时默认执行 1 次。 `loopIntervalSeconds` 是循环开始时间间隔,旧脚本没有这一行时默认 0,也就是上一轮执行完立刻开始下一轮。旧格式 `loopIntervalMs` 仍可加载。 `targetPid` 是上次选择并锁定的实例进程 ID,回放时用于静默复用同一个实例;旧脚本没有这一行也能加载,只是多开时回放会要求先点一次“查找窗口”。 ## CBT Hook(自动启用) 回放开始时会自动尝试加载 CBT Hook DLL,在目标窗口的 UI 线程装一个线程级 `WH_CBT` 钩子,对 `HCBT_ACTIVATE` 返回 1,阻止目标窗口在收到投递点击后把自己激活。界面不再提供开关,默认启用。实现是 `MouseClick.CbtHook.dll`(NativeAOT 共享库,导出 `MouseClickInstall` / `MouseClickUninstall` / `MouseClickCbtProc`),AOT 发布时由 `publish-aot.bat` 追加到 exe 尾部。 - 需要管理员权限(程序的 manifest 已是 `requireAdministrator`); - 单 exe 里带着 DLL payload;程序启动回放时从自己 exe 读出,写到 `%TEMP%\MouseClickCbtHook\instances\MouseClick.CbtHook...dll` 后再 LoadLibrary; - 临时文件按进程 + GUID 唯一,多个 exe 同时跑不会互相覆盖;一天前的临时文件会在下次启动时尽量清理; - 发布目录的 DLL 不会被微信锁住(现在发布目录里本来也没有 DLL 了); - 失效保护:钩子回调会检查 MouseClick 主窗体是否还存在,工具退出/崩溃后主窗体消失,钩子自动放行,不会把游戏永久锁死; - 只装在线程上,不做全局注入; - 只有失败时才在 exe 同目录写 `MouseClick.CbtHook.log`(成功不写),内容包括窗口、错误、源/临时 DLL 路径;32 位微信、缺 DLL、权限、位数不匹配都会记录; - Debug 构建没有 payload,会回退到 exe 同目录的 `MouseClick.CbtHook.dll`; - **风险**:把 DLL 注入微信小游戏宿主(WeChatAppEx)可能触发风控/封号,DLL 崩溃会带崩宿主; - 历史版本已经注入到微信里的 DLL 仍会保持加载,需要重启微信/重启机器后才能删除。 窗口句柄只在当前 Windows 会话里有效,程序会在本次运行中固定你选择的句柄;重新打开游戏或重启程序后,需要重新查找并锁定窗口。