C语言获取并设置鼠标位置:GetCursorPos 与 SetCursorPos 实战大纲
1. 从一次坐标调试说起C语言怎么读写鼠标位置如果你写过桌面自动化的小工具或者做过游戏辅助里的坐标拾取大概率绕不开一个最基础的问题怎么用 C 语言拿到鼠标当前的位置又怎么把鼠标移动到指定坐标。这两个动作听起来简单但真到写代码的时候新手常卡在几个地方POINT结构体到底怎么声明、GetCursorPos传参传的是地址还是值、屏幕坐标和窗口客户区坐标为什么对不上、编译时报undefined reference to GetCursorPos又是怎么回事。这篇就围绕 Windows 平台把GetCursorPos读取坐标和SetCursorPos设置坐标这条链路完整走一遍。核心检索词就是C语言 鼠标位置 GetCursorPos SetCursorPos windows.h适合刚接触 Win32 API 的同学也适合想快速搭一个坐标调试小工具的人。你不需要 MFC不需要 Qt一个.c文件加windows.h就能跑起来。我试过用最朴素的 Dev-C 和 MinGW 两种环境编译同一份代码结论是只要链接对了user32行为完全一致。下面从环境准备讲到可复制代码再到窗口相对坐标的换算最后把几个高频报错逐个拆开。整个过程你跟着敲一遍十分钟内能看到鼠标自己动起来。先明确一下这两个函数的定位。GetCursorPos属于 Win32 API声明在windows.h里实际实现在user32.dll作用是读取光标在屏幕坐标系下的位置单位是像素原点在屏幕左上角。SetCursorPos同样在user32.dll接收两个int参数把光标直接挪到屏幕坐标(x, y)。注意它们操作的都是屏幕绝对坐标不是某个窗口内部的坐标这一点是后面所有坑的根源。为什么强调屏幕坐标因为很多人第一反应是「我要把鼠标移到按钮上」然后拿窗口内的偏移去调SetCursorPos结果鼠标飞到屏幕别的地方去了。窗口在屏幕上的位置、标题栏高度、边框宽度都会影响换算。所以正确的顺序是先用GetCursorPos拿到屏幕坐标再用ScreenToClient转成窗口客户区坐标反过来设置时先用ClientToScreen把客户区坐标转回屏幕坐标再交给SetCursorPos。这条链路理顺了桌面自动化和坐标调试就顺了。2. 前置准备windows.h、POINT 与编译环境怎么配动手之前把地基打牢。这一节解决三件事头文件怎么引、POINT是什么、编译器怎么配。别小看这些后面 80% 的编译错误都出在这里。windows.h是 Win32 API 的总入口头文件里面通过一堆子头文件把GetCursorPos、SetCursorPos、POINT、ScreenToClient全都暴露出来。你只需要在源文件顶部写一行#include windows.h就这一行不需要额外引winuser.h或windef.hwindows.h已经帮你串好了。有些教程会让你引stdio.h和stdlib.h那是为了printf和system跟鼠标 API 本身无关按需加就行。POINT是 Win32 定义的一个结构体原型长这样typedef struct tagPOINT { LONG x; LONG y; } POINT;LONG在 Windows 下就是 32 位有符号整数所以你可以把它当成两个int用。声明一个POINT变量有两种写法效果一样POINT p; // 栈上声明最常用 POINT *p malloc(sizeof(POINT)); // 堆上声明记得 freeGetCursorPos的签名是BOOL GetCursorPos(LPPOINT lpPoint)LPPOINT就是POINT*。所以调用时必须传地址GetCursorPos(p)。传值会直接编译不过因为类型对不上。返回值是BOOL非零表示成功零表示失败严谨点可以判断一下。SetCursorPos的签名是BOOL SetCursorPos(int X, int Y)直接传两个整数没有指针。它返回非零表示移动成功。注意这个函数移动的是物理光标如果目标坐标超出屏幕范围系统会把它钳制到屏幕边缘不会报错。编译环境方面MinGW-w64 是最省事的。装好之后编译命令要显式链接user32gcc mouse_demo.c -o mouse_demo.exe -luser32如果你用 MSVC在开发者命令行里cl mouse_demo.c user32.libDev-C 的话在「项目属性 → 参数 → 链接器」里加上-luser32即可。漏掉-luser32是新手最常见的错误报错信息是undefined reference to GetCursorPos看到这个先检查链接参数。还有一点源文件后缀用.c还是.cpp都行但如果你用.c且编译器按 C89 处理变量声明要放在块首。用.cpp就没这个限制。为了兼容性下面示例统一用.c变量声明放开头。3. 可复制配置与完整示例代码这一节给你一份能直接编译运行的完整代码包含读取坐标、随机移动、窗口相对坐标换算三个部分。你可以整段复制也可以按需裁剪。先看最小可运行版本只做读取和设置#include windows.h #include stdio.h int main(void) { POINT p; /* 读取当前鼠标屏幕坐标 */ if (GetCursorPos(p)) { printf(当前鼠标屏幕坐标: x%ld, y%ld\n, p.x, p.y); } else { printf(GetCursorPos 调用失败, 错误码: %lu\n, GetLastError()); } Sleep(1500); /* 把鼠标移动到屏幕 (300, 400) */ if (SetCursorPos(300, 400)) { printf(已移动到 (300, 400)\n); } else { printf(SetCursorPos 调用失败, 错误码: %lu\n, GetLastError()); } return 0; }编译命令gcc mouse_demo.c -o mouse_demo.exe -luser32运行后你会看到控制台打印当前坐标停顿一秒半鼠标跳到(300, 400)。这里用%ld是因为LONG在 MinGW 下是long用%d在某些编译器上会有警告%ld更稳。接下来是带窗口相对坐标换算的版本。这个更实用因为实际项目里你往往关心的是「鼠标在窗口客户区里的哪个位置」。核心是两个转换函数ScreenToClient把屏幕坐标转成客户区坐标ClientToScreen反过来。#include windows.h #include stdio.h int main(void) { HWND hwnd; POINT screenPt, clientPt; /* 这里用桌面窗口做演示, 实际项目替换成你自己的窗口句柄 */ hwnd GetConsoleWindow(); if (hwnd NULL) { printf(拿不到窗口句柄\n); return 1; } /* 读取鼠标屏幕坐标 */ GetCursorPos(screenPt); printf(屏幕坐标: (%ld, %ld)\n, screenPt.x, screenPt.y); /* 转成该窗口的客户区坐标 */ clientPt screenPt; if (ScreenToClient(hwnd, clientPt)) { printf(客户区坐标: (%ld, %ld)\n, clientPt.x, clientPt.y); } /* 反过来: 把客户区 (100, 100) 转成屏幕坐标并移动过去 */ clientPt.x 100; clientPt.y 100; if (ClientToScreen(hwnd, clientPt)) { SetCursorPos(clientPt.x, clientPt.y); printf(已移动到客户区 (100, 100), 对应屏幕 (%ld, %ld)\n, clientPt.x, clientPt.y); } return 0; }注意ScreenToClient和ClientToScreen都是原地修改传入的POINT所以要先拷贝一份再转别把原始屏幕坐标覆盖了。上面代码里clientPt screenPt;就是干这个的。如果你想把坐标配置抽出来方便改可以用一个简单的 JSON 或 TOML 存参数。比如config.json{ target_x: 300, target_y: 400, delay_ms: 1500, use_client_coords: false }然后在代码里读这个文件。不过纯 C 读 JSON 要引第三方库小工具里更常见的做法是直接用命令行参数或者宏定义。这里给个宏定义的写法改起来最省事#define TARGET_X 300 #define TARGET_Y 400 #define DELAY_MS 1500把这三个宏放到文件顶部SetCursorPos(TARGET_X, TARGET_Y)和Sleep(DELAY_MS)直接用。这样你不用动逻辑代码改数字重编译就行。再补一个随机移动的完整例子跟 excerpt 里的思路类似但更规整#include windows.h #include stdio.h #include stdlib.h #include time.h int main(void) { POINT p; int x, y; int screenW, screenH; srand((unsigned)time(NULL)); screenW GetSystemMetrics(SM_CXSCREEN); screenH GetSystemMetrics(SM_CYSCREEN); printf(屏幕分辨率: %d x %d\n, screenW, screenH); GetCursorPos(p); printf(移动前: (%ld, %ld)\n, p.x, p.y); x rand() % screenW; y rand() % screenH; SetCursorPos(x, y); printf(移动后: (%d, %d)\n, x, y); return 0; }这里用GetSystemMetrics(SM_CXSCREEN)拿屏幕宽高比硬编码1364和768靠谱得多换台机器也不会越界。SM_CXSCREEN和SM_CYSCREEN是系统指标常量返回主显示器的像素尺寸。4. 验证请求与成功结果编译、运行、看输出代码写完怎么确认它真的生效了分三步走编译无警告、运行看打印、肉眼观察鼠标。第一步编译。用 MinGW 的话在命令行里执行gcc mouse_demo.c -o mouse_demo.exe -luser32 -Wall加上-Wall打开所有警告。如果代码没问题应该没有任何输出直接生成mouse_demo.exe。如果报undefined reference to GetCursorPos说明漏了-luser32。如果报POINT undeclared说明windows.h没引或者引错了位置。第二步运行。双击 exe 或者在命令行里执行./mouse_demo.exe以最小版本为例控制台应该输出类似当前鼠标屏幕坐标: x812, y463 已移动到 (300, 400)第一行的数字取决于你运行时光标在哪第二行是固定的。如果你看到这两行说明GetCursorPos和SetCursorPos都调通了。第三步肉眼验证。运行程序后鼠标应该在一秒半后跳到屏幕左上偏中的位置。你可以把SetCursorPos的参数改成(0, 0)看鼠标是不是跑到屏幕左上角改成(screenW - 1, screenH - 1)看是不是跑到右下角。这两个边界测试能帮你确认坐标系方向原点在左上x 向右增y 向下增。对于带窗口换算的版本输出会多几行屏幕坐标: (812, 463) 客户区坐标: (412, 263) 已移动到客户区 (100, 100), 对应屏幕 (500, 300)这里的数字关系是如果控制台窗口在屏幕上的位置是(400, 200)那么屏幕坐标(812, 463)减去窗口位置就得到客户区坐标(412, 263)。注意客户区不包括标题栏和边框所以实际偏移会比窗口位置大一点具体取决于窗口样式。你可以拖动控制台窗口到不同位置再运行一次观察客户区坐标怎么变。如果你想更直观地验证可以在移动后加一句读取确认光标真的到了目标位置SetCursorPos(300, 400); Sleep(100); GetCursorPos(p); printf(确认位置: (%ld, %ld)\n, p.x, p.y);正常情况下会打印(300, 400)。如果打印的是别的值可能是多显示器环境或者 DPI 缩放导致的这个放到排查章节讲。还有一个验证技巧用GetLastError()看错误码。GetCursorPos和SetCursorPos失败时都会设置错误码常见的有ERROR_ACCESS_DENIED权限不足比如在锁屏界面和ERROR_INVALID_PARAMETER参数越界。把错误码打出来比干瞪眼强。5. 本篇常见排查401、local proxy failed、reading choices 与 OAuth 报错对照这一节把实际开发中容易撞上的报错逐个拆开。虽然标题里提了几个看起来像网络请求的错误但它们在鼠标坐标场景里对应的是不同层面的问题我按真实遇到的情况对照说明。报错一undefined reference to GetCursorPos这是链接错误不是编译错误。原因只有一个没链接user32库。解决方法是编译命令加-luser32。如果你用 CMake在target_link_libraries里加user32。如果你用 Visual Studio在项目属性 → 链接器 → 输入 → 附加依赖项里加user32.lib。这个错误跟代码本身无关纯粹是构建配置问题。报错二POINT undeclared (first use in this function)说明windows.h没引进来或者你把它放在了使用POINT之后。检查#include windows.h是否在文件最顶部。还有一种可能是你用了#define WIN32_LEAN_AND_MEAN但没引全这个宏会裁掉一部分头文件正常情况下不影响POINT但如果你同时定义了NOGDI之类的宏可能会出问题。最稳妥的做法就是老老实实引windows.h别乱加裁剪宏。报错三local proxy failed或reading choices这类网络层报错这两个错误通常出现在你调用了某个 HTTP 接口或者大模型 API 的场景跟鼠标 API 本身没关系。但如果你在写一个「读取鼠标坐标后发给远端服务」的工具就可能同时遇到。local proxy failed一般是本地代理配置有问题reading choices通常是响应体解析失败比如返回的不是预期 JSON。排查思路是先用curl或 Postman 单独测接口确认网络通、返回格式对再回到 C 代码里检查WinHTTP或libcurl的调用。如果你用的是 TaoToken 这类平台的 APIBase URL 要填https://taotoken.net/apiKey 在控制台的 API Keys 页面生成模型 ID 按文档填这三件套缺一不可。报错四OAuth 相关报错如果你在做一个需要登录授权的桌面工具可能会碰到 OAuth 回调失败。常见原因是回调地址没在平台后台登记或者本地端口被占用。排查时先确认回调 URL 跟后台配置完全一致包括端口号和路径。另外注意OAuth 流程里不要用SetCursorPos去模拟点击那种做法既不稳定也不安全老老实实走标准授权流程。报错五坐标对不上鼠标没到预期位置这个不是编译错误是逻辑错误。三个可能原因一是多显示器GetSystemMetrics(SM_CXSCREEN)只返回主显示器尺寸副屏坐标可能是负数或超出主屏范围二是 DPI 缩放在 125% 或 150% 缩放下逻辑坐标和物理坐标不一致需要调用SetProcessDPIAware()声明进程 DPI 感知三是窗口坐标换算时忘了ScreenToClient直接拿屏幕坐标当客户区坐标用。逐个排查先打印原始坐标再打印转换后坐标对比一下就知道哪步错了。报错六SetCursorPos返回成功但鼠标没动这种情况通常发生在锁屏、UAC 提权界面或者远程桌面会话里。这些场景下系统会拦截光标移动函数返回成功但实际不生效。解决办法是在正常桌面会话里测试或者用SendInput模拟鼠标事件替代直接设置坐标。SendInput更底层但代码也复杂一些适合对可靠性要求高的场景。6. 继续深入把坐标能力接到你的工作流里鼠标坐标读写只是桌面自动化的起点。掌握GetCursorPos和SetCursorPos之后你可以往上叠很多东西配合GetAsyncKeyState做热键拾取坐标配合FindWindow定位特定窗口再换算客户区坐标配合定时器做轨迹录制和回放。这些组合起来就是一个简易的坐标调试工具。如果你打算把坐标数据发给远端做分析或者接一个大模型来做「看屏幕、给操作建议」的 Agent那 API 接入这块要配好。TaoToken 的模型对话入口在https://taotoken.net/apiAPI Key 在控制台的 API Keys 页面生成模型 ID 按文档选。写 C 代码调接口的话用 WinHTTP 或者 libcurl 都行记得把 Base URL、Key、Model ID 三件套填全少一个都会报错。长期跑编码类任务或者 Agent 的话可以看看 Coding Plan额度更划算。回到代码本身给你一个实用的小技巧把坐标读取和移动封装成两个函数主逻辑里只调函数这样换项目时直接拷这两个函数就行。POINT GetMousePos(void) { POINT p {0, 0}; GetCursorPos(p); return p; } void MoveMouseTo(int x, int y) { SetCursorPos(x, y); }简单但能省掉重复写p的功夫。再进一步可以加一个MoveMouseToClient(HWND hwnd, int x, int y)内部自动做ClientToScreen换算调用方就不用关心屏幕坐标了。最后提醒一句SetCursorPos移动的是真实光标如果你在写自动化脚本记得加Sleep给系统留出响应时间连续快速移动可能会被系统合并或丢弃。一般每次移动后停 50 到 100 毫秒比较稳。坐标调试场景下这个延迟也方便你肉眼观察移动轨迹。

相关新闻

【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接

【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接

附下载链接,有中文注释,可联系我获取代码定制和讲解服务 文章目录程序讲解概述算法原理实现流程运行结果MATLAB源代码程序讲解 概述 在负载增广扩展卡尔曼滤波(EKF)中加入有界渐消因子,根据新息能量调整预测协方差&a…

2026/10/9 12:54:30 阅读更多 →
图书借阅系统课设:还书状态同步与超期计算核心实践

图书借阅系统课设:还书状态同步与超期计算核心实践

简介:本资源是面向高校数据库课程设计的完整实践项目——图书借阅管理系统,适用于计算机、信息管理等专业本科生开展数据库原理与应用综合实训。项目覆盖数据库设计、SQL编程、事务控制、权限管理及性能优化等核心知识点,可直接用于课设答辩、…

2026/10/9 12:53:28 阅读更多 →
使用MCP进行代码执行:构建更高效的智能体——TaoToken统一Key接入实战

使用MCP进行代码执行:构建更高效的智能体——TaoToken统一Key接入实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 12:53:28 阅读更多 →

最新新闻

OPC DA报错找不到OpcEnum?补装OPC Core Components 2.0快速解决

OPC DA报错找不到OpcEnum?补装OPC Core Components 2.0快速解决

简介:OPC Core Components 2.0 是OPC基金会发布的核心组件集合,主要面向工业自动化开发者、系统集成商与现场维护人员。它直击电脑未安装 OpcEnum 时无法枚举和访问网络 OPC 服务器的问题,完成组件安装即可恢复通信能力。OPC UA 作为下一代标…

2026/10/10 14:56:02 阅读更多 →
《创业之路》-1032-细读商业经典 - 思维惯性(思维)和路径依赖(行为),是制约人适应新环境、无法跨越周期的最大的制约力

《创业之路》-1032-细读商业经典 - 思维惯性(思维)和路径依赖(行为),是制约人适应新环境、无法跨越周期的最大的制约力

思维惯性与路径依赖:跨周期失败的终极底层枷锁这句话戳中了所有个人、企业乃至国家跨越周期失败的共同根源:绝大多数人不是能力不够、资源不足、机会没赶上,而是被过去成功塑造的思维惯性和路径依赖牢牢锁死,用上一个周期的成功逻…

2026/10/10 14:56:02 阅读更多 →
SLR(1)语法分析器实战:从编译原理原理到自定义文法实现

SLR(1)语法分析器实战:从编译原理原理到自定义文法实现

简介:这是基于Java实现的SLR(1)语法分析器实验源码包,面向编译原理课程学习者与需要动手实践语法分析器构建的开发者。资源围绕自底向上的SLR(1)解析方法展开,涵盖文法表示、消除左递归与左公因子、FOLLOW集构造、闭包与GO TO集计算以及分析表…

2026/10/10 14:56:02 阅读更多 →
异常安全编程实战:从资源管理到事务性更新的系统稳定性指南

异常安全编程实战:从资源管理到事务性更新的系统稳定性指南

做后端开发这些年,我见过太多线上事故。但最让我头疼的,往往不是那些高深的并发问题,而是一些看起来人畜无害的代码,在某个异常被抛出后,把整个系统的数据搞得一团糟。最近不少朋友也在聊“安全服务异常,无…

2026/10/10 14:56:02 阅读更多 →
《创业之路》-1031-细读商业经典 - 为什么有人摆脱不了贫穷:被锁死在「被动贫困闭环」里的人

《创业之路》-1031-细读商业经典 - 为什么有人摆脱不了贫穷:被锁死在「被动贫困闭环」里的人

为什么有人摆脱不了贫穷:被锁死在「被动贫困闭环」里的人摆脱不了贫穷,本质上从来不是懒、笨或者运气差,而是陷入了一套和「主动演化逻辑」完全反向的被动贫困闭环:认知上执念确定性、行为上习惯执行型、价值观上信奉存量博弈&…

2026/10/10 14:56:02 阅读更多 →
Virtual Mac 安装全流程:从 Dopamine 越狱到 Sileo 部署 macOS 虚拟机

Virtual Mac 安装全流程:从 Dopamine 越狱到 Sileo 部署 macOS 虚拟机

【免费下载链接】VirtualMacOniPad People have dreamed of running macOS on iPad for more than a decade. Today, that dream comes true. With Virtual Mac, iPad finally breaks free from iPadOS, enabling pro apps like Xcode, Terminal, Final Cut Pro, Logic Pro, an…

2026/10/10 14:55:01 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →