惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
The GitHub Blog
The GitHub Blog
博客园_首页
T
The Blog of Author Tim Ferriss
H
Hackread – Cybersecurity News, Data Breaches, AI and More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
腾讯CDC
I
InfoQ
量子位
J
Java Code Geeks
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
Webroot Blog
Webroot Blog
Martin Fowler
Martin Fowler
D
Docker
F
Fortinet All Blogs
云风的 BLOG
云风的 BLOG
V
Vulnerabilities – Threatpost
罗磊的独立博客
P
Proofpoint News Feed
T
The Exploit Database - CXSecurity.com
Cyberwarzone
Cyberwarzone
P
Privacy & Cybersecurity Law Blog
Last Week in AI
Last Week in AI
爱范儿
爱范儿
The Hacker News
The Hacker News
S
SegmentFault 最新的问题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
V
V2EX
Simon Willison's Weblog
Simon Willison's Weblog
AI
AI
Y
Y Combinator Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
GbyAI
GbyAI
V
Visual Studio Blog
H
Heimdal Security Blog
S
Secure Thoughts
B
Blog RSS Feed
雷峰网
雷峰网
T
Tenable Blog
C
Check Point Blog
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
About on SuperTechFans
Recent Commits to openclaw:main
Recent Commits to openclaw:main

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第09章:列表推导、递归与算法建模 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第06章:CSG 布尔建模方法 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 第04章:参数、变量、函数、模块与作用域 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第十章:定时任务与自动化(Cron) 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 07-核心工具链 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 05-TDD系统化调试与完成前验证 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
第04章 - 鼠标控制详解
我才是银古 · 2026-06-24 · via 博客园 - 我才是银古

第04章 - 鼠标控制详解

鼠标控制是桌面自动化中最基础、使用频率最高的能力之一。RobotGo 提供了一整套丰富的鼠标 API,从简单的移动点击,到平滑轨迹移动、拖拽、滚轮滚动、相对移动、按键状态切换等,几乎覆盖了所有真实鼠标操作。本章将系统讲解这些函数及其参数细节。

4.1 坐标系与多屏幕

在深入函数之前,先明确坐标系:

  • 坐标原点 (0, 0) 位于主显示器的左上角。
  • x 轴向右为正,y 轴向下为正。
  • 在多显示器环境中,副屏可能位于主屏的左侧或上方,此时落在副屏的坐标可能是负数。RobotGo 的移动函数支持跨屏的负坐标,例如 robotgo.Move(100, -200) 可以把鼠标移动到主屏上方的副屏区域。

读取当前鼠标位置使用:

x, y := robotgo.Location()
fmt.Println("鼠标当前坐标:", x, y)

4.2 鼠标移动

4.2.1 瞬间移动 Move

Move 让鼠标瞬间“跳”到目标坐标,没有中间轨迹:

robotgo.Move(500, 300)

4.2.2 平滑移动 MoveSmooth

MoveSmooth 会让鼠标沿着一条带有缓动效果的轨迹移动到目标点,更接近真人操作,常用于需要规避“瞬移检测”或追求视觉自然的场景:

// 基本用法
robotgo.MoveSmooth(300, 300)

// 带可选参数:low 与 high 控制速度/平滑程度
// 第三、四个参数分别是 low(最低速度系数)和 high(最高速度系数)
robotgo.MoveSmooth(100, 200, 1.0, 10.0)

MoveSmooth 的后两个可选浮点参数用于调节移动的速度曲线,数值越大移动越慢、越平滑。可根据需要微调以获得理想的轨迹效果。

4.2.3 相对移动 MoveRelative

MoveRelative 基于鼠标当前位置进行偏移移动,而不是绝对坐标:

robotgo.Move(100, 100)
robotgo.MoveRelative(0, -10) // 在当前基础上向上移动 10 像素

4.3 鼠标点击

4.3.1 Click

Click 是最常用的点击函数,其签名支持可变参数:

robotgo.Click()                  // 默认点击左键
robotgo.Click("right")           // 点击右键
robotgo.Click("center")          // 点击中键
robotgo.Click("wheelLeft")       // 滚轮向左
robotgo.Click("wheelRight")      // 滚轮向右
robotgo.Click("left", true)      // 双击左键(第二个参数 true 表示双击)

第一个参数指定按键("left""right""center" 等),第二个布尔参数指定是否双击(true 为双击)。

4.3.2 在指定坐标点击

一种常见模式是“先移动再点击”:

robotgo.Move(400, 250)
robotgo.Click()

也可以利用 MouseSleep 在移动和点击之间自动留出延迟,避免目标程序来不及响应:

robotgo.MouseSleep = 100
robotgo.Move(400, 250)
robotgo.Click()

4.4 鼠标按键状态切换 Toggle

有些场景需要“按下不放”或“松开”,例如手动实现拖拽、长按。Toggle 用于切换某个鼠标键的按下/松开状态:

robotgo.Toggle("left")        // 按下左键
// ... 做一些操作,比如移动鼠标 ...
robotgo.Toggle("left", "up")  // 松开左键

第一个参数是按键名,第二个参数指定动作:省略或 "down" 表示按下,"up" 表示松开。

4.5 鼠标拖拽

4.5.1 DragSmooth

DragSmooth 在按住左键的同时平滑移动到目标坐标,实现拖拽:

robotgo.Move(100, 100)        // 先移动到起点
robotgo.DragSmooth(300, 300)  // 按住左键拖拽到 (300, 300)

4.5.2 用 Toggle 手动实现拖拽

如果需要更精细的控制,也可以用 Toggle 组合实现:

robotgo.Move(100, 100)
robotgo.Toggle("left")         // 按下
robotgo.MoveSmooth(300, 300)   // 平滑移动
robotgo.Toggle("left", "up")   // 松开

这种写法可以在按下与松开之间插入任意复杂的中间逻辑。

4.6 滚轮滚动

RobotGo 提供了多种滚轮滚动方式,适应不同需求。

4.6.1 ScrollDir:按方向滚动

ScrollDir 按指定方向滚动给定的“格数”:

robotgo.ScrollDir(10, "up")    // 向上滚动 10
robotgo.ScrollDir(20, "right") // 向右滚动 20
robotgo.ScrollDir(10, "down")  // 向下滚动 10
robotgo.ScrollDir(10, "left")  // 向左滚动 10

4.6.2 Scroll:按 x、y 偏移滚动

Scroll 接收水平和垂直两个方向的滚动量:

robotgo.Scroll(0, -10)  // 垂直方向滚动 -10
robotgo.Scroll(100, 0)  // 水平方向滚动 100

4.6.3 ScrollSmooth:平滑滚动

ScrollSmooth 提供更平滑的滚动效果:

robotgo.ScrollSmooth(-10, 6)

4.6.4 ScrollRelative:相对滚动

robotgo.ScrollRelative(10, -100)

不同的滚动函数在不同平台、不同应用下表现可能略有差异,建议在实际目标程序上做一些测试,挑选最稳定的一种。

4.7 完整示例

下面是一个综合演示鼠标各项能力的程序,改编自官方示例:

package main

import (
    "fmt"

    "github.com/go-vgo/robotgo"
)

func main() {
    robotgo.MouseSleep = 300

    // 移动与定位
    robotgo.Move(100, 100)
    fmt.Println(robotgo.Location())
    robotgo.Move(100, -200) // 多屏支持
    robotgo.MoveSmooth(120, -150)
    fmt.Println(robotgo.Location())

    // 滚动
    robotgo.ScrollDir(10, "up")
    robotgo.ScrollDir(20, "right")
    robotgo.Scroll(0, -10)
    robotgo.Scroll(100, 0)

    robotgo.MilliSleep(100)
    robotgo.ScrollSmooth(-10, 6)

    // 移动与拖拽
    robotgo.Move(10, 20)
    robotgo.MoveRelative(0, -10)
    robotgo.DragSmooth(10, 10)

    // 点击
    robotgo.Click("wheelRight")
    robotgo.Click("left", true)
    robotgo.MoveSmooth(100, 200, 1.0, 10.0)

    // 按键状态切换
    robotgo.Toggle("left")
    robotgo.Toggle("left", "up")
}

4.8 实战技巧与注意事项

  1. 先慢后快:调试阶段把 MouseSleep 设大一些(如 300ms),方便你用肉眼观察脚本行为;稳定后再调小以提速。
  2. 坐标校准:不同分辨率、不同缩放(DPI)下,同一个 UI 元素的像素坐标可能不同。尽量避免硬编码坐标,结合图像查找(第 8 章)来定位元素更稳健。
  3. 平滑移动反检测:部分应用会检测“鼠标瞬移”,此时优先使用 MoveSmooth / DragSmooth
  4. 多屏负坐标:处理多显示器时要清楚副屏相对主屏的方位,必要时用 GetDisplayBounds(第 7 章)获取各屏边界。
  5. 拖拽稳定性:用 Toggle 手动拖拽时,务必保证最终一定调用 Toggle("left", "up") 松开,否则会导致鼠标“卡在按下状态”。

4.9 小结

本章系统讲解了 RobotGo 的鼠标控制能力:坐标系与多屏概念、瞬间/平滑/相对移动、各种点击方式、按键状态切换、拖拽以及多种滚轮滚动方法。我们还通过完整示例把这些函数串联起来,并总结了实战技巧。下一章我们将转向键盘控制,讲解按键、组合键与文本输入的方方面面。