1. 项目概述一个解决“屏幕锁”痛点的桌面小工具如果你也像我一样经常需要在客户面前做演示或者让电脑长时间运行某个需要保持“活跃”状态的程序那你一定对“屏幕自动锁定”这个功能又爱又恨。爱的是它能保护隐私恨的是它总在不合时宜的时候跳出来打断你的演示。尤其是在公司配发的笔记本电脑上电源选项和屏幕锁定策略往往被IT部门锁死你连调整“从不”锁屏的权限都没有。每次演示前都得在心里默默记着“每隔几分钟要动一下鼠标”这无疑分散了宝贵的注意力。今天要分享的就是我为了解决这个具体痛点而开发的一个C#桌面小工具Auto Mouse Mover。它的核心功能非常简单在后台自动、智能地模拟鼠标移动从而欺骗操作系统让它认为用户一直在活动进而阻止屏幕进入锁屏或睡眠状态。别看它功能简单在特定场景下它的实用性和可靠性远超你的想象。这个项目完全开源使用MIT许可证你可以自由地使用、修改甚至分发它。2. 核心设计思路与实现原理2.1 为什么不用现成的“鼠标抖动器”市面上其实有不少类似的工具那为什么还要自己动手写一个这源于我在实际使用中遇到的几个痛点功能冗余与干扰很多工具功能繁杂附带广告或不需要的组件不够纯粹。不够“智能”有些工具会无脑地、周期性地移动鼠标即使你正在使用电脑比如打字它也会强行移动光标干扰正常操作。系统兼容性与权限一些工具依赖特定的.NET框架版本或系统API在受限制的企业环境中可能无法运行。可定制性差移动间隔、像素距离、是否模拟点击等参数无法精细调整。因此我的设计目标很明确开发一个轻量、安静、智能、可配置且兼容性好的后台工具。2.2 核心工作原理拆解这个工具的逻辑链条非常清晰其核心工作流程可以概括为“感知-判断-执行”循环后台驻留与隐身程序启动后主窗口可以最小化到系统托盘甚至可以选择隐藏托盘图标真正做到“无影无踪”只作为一个后台服务运行。周期性状态检查程序内部有一个计时器每隔设定的时间例如60秒触发一次检查。智能判断用户活跃度这是实现“智能”的关键。每次检查时程序会获取当前鼠标光标的坐标位置并与上一次检查时记录的位置进行比对。如果位置相同说明在这段时间间隔内用户没有进行任何鼠标操作可能离开了电脑。此时程序判定需要执行模拟操作来维持系统活跃状态。如果位置不同说明用户正在正常使用鼠标程序会安静地跳过本次操作绝不打扰。执行模拟操作当判定需要模拟时程序会执行两个可选动作移动鼠标将光标在当前位置的基础上水平移动一个微小的像素距离例如5像素然后立即移回原位置。这样光标在屏幕上做了一个“抖动”但最终停留点不变用户几乎察觉不到也不会让光标漂移到屏幕外。模拟左键点击对于一些对“用户活动”检测更为严格的应用程序例如某些视频播放器、远程桌面会话仅仅移动鼠标可能不够。因此程序在移动鼠标后还可以额外模拟一次左键单击在光标当前位置这通常能更有效地“唤醒”应用。调用底层系统API为了实现后台模拟输入C#标准库中的SendKeys或Cursor.Position在后台窗口激活状态下可能受限。因此本项目直接通过P/Invoke技术调用了Windows底层的user32.dll中的两个关键APIGetCursorPos: 用于获取当前光标精确位置。SendInput: 用于发送模拟的鼠标移动和点击事件。这种方式绕过了高层框架的限制确保了模拟操作在后台也能被系统准确识别。注意直接调用SendInputAPI是此工具能在后台生效的技术核心。这比单纯设置Cursor.Position属性要可靠得多因为后者在某些情况下可能不会触发系统的“用户活动”检测。2.3 技术选型为什么是C#和WinFormsC#与.NET Framework/WinForms这是开发Windows桌面小工具最高效的组合之一。WinForms提供了快速构建简单GUI的能力而C#的语法简洁P/Invoke调用Native API也非常方便。更重要的是.NET程序的兼容性极好从Windows 7到Windows 11都能良好运行无需额外安装庞大的运行时环境特别是使用.NET Framework时。系统托盘集成WinForms原生支持NotifyIcon控件可以非常方便地实现最小化到托盘、显示图标、右键菜单等功能完美契合“后台工具”的定位。配置持久化使用.NET自带的Application.UserAppDataPath路径和Settings设置文件可以轻松实现用户配置如间隔时间、移动像素、是否点击等的保存与读取实现“一次设置永久生效”。3. 从零开始构建与配置详解3.1 环境准备与项目编译假设你是一个有一定C#基础想了解如何构建或定制这个工具的开发者。以下是详细的步骤获取源代码从GitHub仓库ebellocchia/auto_mouse_mover克隆或下载项目源码。开发环境你需要安装Visual Studio 2019或更高版本社区版即可。项目基于.NET Framework确保VS中安装了相应的开发 workload。打开与编译用VS打开解决方案文件.sln。在解决方案资源管理器中你会看到一个结构清晰的项目。直接按下F6生成解决方案或CtrlShiftB。Debug模式适合开发调试生成的文件包含调试符号体积较大。Release模式用于最终分发编译器会进行优化生成体积更小、运行更快的可执行文件.exe。输出文件编译成功后在项目目录的\AutoMouseMover\bin\Debug\或\AutoMouseMover\bin\Release\文件夹下你会找到AutoMouseMover.exe。这个单文件就是可运行的程序可以复制到任何Windows电脑上使用无需安装。3.2 图形界面GUI参数配置全解析首次运行AutoMouseMover.exe你会看到一个简洁的配置窗口。每一个选项都有其设计用意核心操作区“Start” / “Stop” 按钮控制整个自动移动功能的开启与关闭。“Perform left click” 复选框是否在移动鼠标后模拟一次左键点击。建议场景如果你需要保持一个特定应用程序前台活跃如全屏演示的PPT勾选此项效果更佳。高级设置区点击展开“Time interval (seconds)”两次模拟操作之间的等待时间。默认值是60秒。这个值需要权衡太短如10秒系统活动信号频繁更保险但可能增加微不足道的CPU占用。太长如300秒在有些锁屏策略设置为1分钟的电脑上可能会在两次模拟之间触发锁屏。我的经验是设置为比系统锁屏时间短20-30秒最为稳妥。例如系统锁屏是1分钟60秒这里可以设为40秒。“Pixels to move cursor”每次模拟移动的像素距离。默认值是5像素。这是一个非常精妙的设置。在1080P的屏幕上5个像素的移动几乎不可见。在4K等高分辨率屏幕上更是微乎其微。为什么不是0或1某些系统对极微小的移动可能不敏感无法触发活动状态检测。5像素是一个经过测试、兼容性较好的经验值。不建议设置过大如100像素否则你会看到光标在屏幕上周期性“跳跃”干扰观感。“Minimize to tray on start” 复选框程序启动后自动最小化到系统托盘而不是任务栏。强烈建议勾选这才是后台工具的常态。“Show tray icon” 复选框是否在系统托盘显示程序图标。勾选时托盘可见可以双击图标恢复窗口右键图标有“打开”和“关闭”菜单管理方便。取消勾选时程序完全隐身。关闭它的唯一方式是通过任务管理器CtrlShiftEsc结束进程。适用于“设置一次长期运行不想被任何人包括自己打扰”的极端场景比如在专用的演示电脑上。状态与提示所有设置会在你关闭窗口时自动保存到用户配置文件中。程序启动时会自动加载上次的配置包括“是否正在运行”的状态。也就是说如果你上次是“启动”后直接关闭窗口到托盘下次开机后它可能会自动在后台继续工作。4. 高级使用场景与实战技巧4.1 场景一展会/客户现场演示这是本工具的“主场”。将演示电脑接好大屏幕打开你的PPT或演示软件并全屏。启动Auto Mouse Mover勾选“Perform left click”和“Minimize to tray on start”。设置时间间隔先查一下电脑的锁屏时间如果可查。假设未知保险起见将间隔设为40秒。点击Start然后将其最小化。现在你可以完全专注于讲解无需再担心屏幕变黑或跳出锁屏界面。即使你的手离开了鼠标和键盘半小时演示也会流畅进行。实操心得在非常重要的演示前我会提前10分钟启动工具并进行一次“压力测试”让电脑静止观察一个锁屏周期通常是1分钟后工具是否能成功阻止锁屏。这能避免现场出现意外。4.2 场景二保持应用程序活跃有些应用程序在长时间无操作后会暂停或断开连接。例如公司内网的即时通讯工具如某些版本的Skype for Business。需要保持登录状态的网页应用如某些后台管理系统登录会话过期时间较短。正在执行长时间任务的软件如渲染、下载这些软件有时会因系统进入睡眠而暂停。操作方法将需要保持活跃的窗口置于前台。运行Auto Mouse Mover务必勾选“Perform left click”。将工具的“Time interval”设置为小于应用休眠时间的值例如应用30分钟无操作会休眠则设置为25分钟1500秒。由于模拟点击发生在当前光标位置请确保光标停留在目标应用程序的窗口区域内比如停留在窗口标题栏或空白处。一个技巧是把光标移到目标窗口的一个不碍事的角落然后再启动工具。4.3 场景三作为轻量级“防睡眠”工具虽然Windows有电源管理设置但在某些特殊情况下如通过远程桌面连接时本地电脑容易睡眠或者你不想修改全局电源设置时这个工具可以作为一个临时、轻量的“防睡眠”方案。配置要点仅仅移动鼠标通常足以阻止锁屏但要阻止睡眠Suspend可能需要配合“模拟点击”因为系统对睡眠的判断逻辑更为复杂。同时确保在Windows的“电源选项”中关闭“关闭硬盘”等设置只依赖本工具维持系统不睡眠。5. 常见问题排查与开发者扩展指南5.1 用户常见问题速查表问题现象可能原因解决方案工具启动了但屏幕仍然锁屏。1. “Time interval”大于系统锁屏超时时间。2. 未勾选“Perform left click”而系统或特定应用需要检测点击事件。3. 工具被安全软件如某些企业终端防护拦截。1. 减小“Time interval”例如设为30秒。2. 勾选“Perform left click”并确保光标在桌面或前台应用内。3. 检查安全软件日志或将工具加入白名单。我看不到光标移动但任务管理器显示程序在运行。1. “Pixels to move”设置过小比如1像素在高分辨率屏上难以察觉。2. 程序正在运行但当前鼠标位置频繁变动你在操作工具未触发模拟。1. 这是正常现象。可将像素值暂时调大到20观察效果确认后改回5。2. 停止手动移动鼠标等待一个间隔时间后观察。如何彻底关闭隐藏了托盘图标的程序程序完全隐身无界面。打开任务管理器CtrlShiftEsc在“进程”或“详细信息”选项卡中找到“AutoMouseMover.exe”右键选择“结束任务”。程序在Windows启动时自动运行了吗当前版本未集成开机自启功能。需要手动创建快捷方式并放入“启动”文件夹shell:startup。或者你可以自行修改代码在设置中增加开机启动选项。我想修改界面语言例如改成中文。程序目前支持英文和意大利文通过本地化资源文件实现。你需要手动添加中文资源文件。复制一份现有的.resx文件如Form1.it-IT.resx重命名为Form1.zh-CN.resx然后用文本编辑器或VS资源编辑器翻译其中的所有字符串值。程序会根据系统语言自动选择。5.2 给开发者的扩展建议如果你对C#感兴趣想把这个工具变得更强大这里有几个方向增加开机自启功能在设置中增加一个复选框“Run at Windows startup”。实现代码可以通过在注册表HKCU\Software\Microsoft\Windows\CurrentVersion\Run下添加项或创建快捷方式到用户启动文件夹来实现。增强活动检测目前的逻辑仅检测鼠标移动。可以扩展为同时检测键盘活动通过GetAsyncKeyStateAPI实现更精准的用户空闲判断。模式扩展除了“原地抖动”可以增加“画小圈”、“缓慢平移”等更隐蔽的移动模式或者设置“工作时间表”只在工作日的9点到18点运行。UI美化与现代化将WinForms界面升级为WPF获得更现代的外观和更灵活的动画效果如启动/停止时的平滑过渡。跨平台考虑核心逻辑定时、模拟输入是平台相关的。如果考虑跨平台可以使用.NET MAUI或Avalonia等框架但模拟输入部分需要为macOS和Linux编写不同的原生互操作代码。这个项目代码结构清晰核心的模拟输入代码集中在NativeMethods类和定时器事件处理函数中非常适合作为初学者学习C#、WinForms、P/Invoke和后台服务开发的实战案例。你可以自由地 fork 它按照你的想法进行改造让它更好地为你服务。毕竟最好的工具永远是那个恰好满足你自己需求的工具。