简介本资源是一份基于MATLAB实现键盘与鼠标行为模拟的轻量级程序源码面向MATLAB初学者及自动化测试、人机交互方向的开发人员解决GUI自动化操作、脚本化控制等实际场景中的底层输入模拟需求。压缩包仅含1个核心文件.m脚本代码完整且附有详细中文注释涵盖Windows平台下调用系统API模拟按键、鼠标移动、点击等关键功能结构清晰、逻辑明确便于快速理解与二次开发。资源包大小仅1KB无冗余依赖开箱即用。目前已有342人学习下载适合用于教学演示、实验验证或嵌入小型自动化流程中。读者可直接复用该脚本实现MATLAB环境下的界面自动触发、批量操作或辅助测试同时掌握MATLAB调用外部动态链接库DLL及Windows消息机制的基础实践方法。 做自动化脚本的朋友应该都遇过这种需求用MATLAB去模拟键盘输入和鼠标点击把重复的机械操作交给程序完成。最近整理源码包时翻出一个“matlab模拟键盘、鼠标程序源码”正好把实现思路、核心代码、以及我踩过的坑一起梳理出来。这个源码包适用于自动化测试、批量数据录入、软件操作演示等场景凡是能把操作步骤固定下来的任务都可以用它减少人工干预。如果你是刚接触MATLAB但想控制鼠标键盘的新手或者已经用过Java Robot但没在MATLAB里封装过的老手这篇文章都能给你一个可以直接抄作业的参考。我最早接触这个需求是为了给公司做软件回归测试每天手工重复点击同一套界面点完还要核对结果。后来我把这套模拟键盘鼠标的MATLAB源码封装成函数库测试脚本从二百行缩到几十行省下的时间可以去做更有价值的事。下面会把源码包从设计思路、技术选型到完整实施步骤和常见问题逐个拆开讲。1. 项目概述与设计思路1.1 这个源码包解决什么问题“matlab模拟键盘、鼠标程序源码”本质上是利用MATLAB调用底层系统能力向操作系统发送模拟输入事件。简单说你可以让MATLAB自动帮你在某个输入框里打字自动移动鼠标到屏幕指定坐标并点击甚至模拟组合键完成复制粘贴、全选、保存等操作。它的典型使用场景有三个自动化测试重复点击界面按钮、录入表单数据并配合截图或日志验证结果。批量数据录入把Excel或矩阵里的数据按固定节奏输入到外部软件中。演示控制在录屏或演示过程中用脚本控制鼠标键盘避免人工操作失误。我见过不少人在网上找类似源码下载后打开一看只有零散函数没有说明文档也不知道怎么调用。这个源码包最大的价值是把模拟输入封装成独立函数你只需要传入按键名或屏幕坐标即可不用每次去写Java Robot那一堆对象调用。1.2 为什么选择MATLAB做键盘鼠标模拟很多人第一反应是模拟键盘鼠标用Python、AutoHotkey、按键精灵不香吗为什么非得用MATLAB我的回答是因为你手里的数据处理、算法计算、图表生成全在MATLAB里如果能让MATLAB直接控制外部软件整个工作流就闭环了。举个例子我做过一个批量报表生成工具先从数据库读数据在MATLAB里算好统计结果然后自动打开Excel模板模拟键盘填入数据最后模拟鼠标点击“导出”。整个过程不需要切换工具也不需要学第二门语言。另外MATLAB对Java类库有很好的兼容性我们可以直接调用java.awt.Robot类来模拟输入。这是一个官方标准类库稳定、跨平台在Windows、Linux、macOS上都能用。相比调用Windows APIJava Robot的代码更简洁也没有32位/64位DLL迁移的麻烦。1.3 源码包整体目录结构拿到源码包解压后目录结构很清晰我建议你先看一眼就知道哪些文件有用matlab模拟键盘鼠标程序源码/ ├── README.md ├── src/ │ ├── keySimulator.m │ ├── mouseSimulator.m │ ├── comboKeys.m │ ├── typeString.m │ ├── clipboardPaste.m │ └── simulateInput.m ├── examples/ │ ├── demo_key.m │ ├── demo_mouse.m │ ├── demo_combokeys.m │ └── auto_typing_demo.m ├── docs/ │ └── 使用说明.md └── LICENSEsrc目录放核心源码examples目录放可直接运行的示例脚本。我建议你拿到源码后先运行demo_mouse.m和demo_key.m确认当前环境能正常弹动鼠标、输出字符再深入修改。2. 技术选型与实现原理2.1 MATLAB里控制键盘鼠标的几种方案对比在MATLAB中实现模拟输入常见方式有四种我整理成一个表格方便对比方案原理优点缺点Java Robot类调用java.awt.Robot跨平台、代码简洁依赖Java运行环境MATLAB自带JVM基本无忧Windows API通过loadlibrary调用user32.dll能模拟更底层输入仅Windows、指针参数处理繁琐、容易崩溃.NET接口调用System.Windows.Forms.SendKeys组合键方便依赖.NET环境跨平台差速度偏慢第三方工具箱如Psychtoolbox KbCheck心理学实验专用定位不适合通用模拟我最终选Java Robot作为主方案。为什么不选Windows API因为MATLAB里调用dll需要写库定义文件还要处理指针和回调调试成本高。而Java Robot在MATLAB里只需四行代码就能初始化并开始模拟操作维护成本低很多。2.2 Java Robot类的核心机制Java Robot类的工作原理很简单它并不是直接往应用窗口里塞消息而是把事件投递到操作系统的事件队列中由系统再分发给当前焦点窗口。这样做的好处是通用性强不管目标软件是Win32程序、Qt程序还是网页应用都能响应。一个基本的按键模拟流程是初始化Robot对象robot Robot;调用keyPress按下键盘某个键。调用keyRelease释放这个键。在MATLAB中我们通过import命令导入Java类然后像普通对象一样调用方法。示例代码import java.awt.Robot; import java.awt.event.KeyEvent; robot Robot; % 按下并释放字母 A robot.keyPress(KeyEvent.VK_A); robot.keyRelease(KeyEvent.VK_A);注意keyPress和keyRelease通常要成对出现如果只按下不释放可能造成按键卡住影响后续操作。这也是初学者最容易踩的坑。2.3 为什么不用SendKeys方案有些人知道MATLAB可以通过system(powershell ...)或者.NET的SendKeys模拟按键但实际用起来并不顺畅。SendKeys对特殊字符的转义规则复杂比如要模拟花括号、加号、脱字符时需要额外加花括号转义。而且SendKeys的异步特性会让脚本很难控制时序很多时候前一个键还没发出去下一个就来了最终丢字符。Java Robot则是同步合成事件调用keyPress后立即进入系统队列时序可控性强。这也是我在自动化录入场景中更信任它的原因。3. 核心模块设计与代码解析3.1 模拟键盘输入的实现源码包里的keySimulator.m函数负责把按键名转成Java KeyEvent常量并模拟按下和释放。它的设计目标是让你不必记忆KeyEvent.VK_ENTER这些东西只需要写keySimulator(enter); keySimulator(ctrl);函数内部维护了一个映射表把常见按键名映射到Java常量。核心代码如下function keySimulator(keyName) import java.awt.Robot; import java.awt.event.KeyEvent; keyMap containers.Map(); keyMap(enter) KeyEvent.VK_ENTER; keyMap(esc) KeyEvent.VK_ESCAPE; keyMap(tab) KeyEvent.VK_TAB; keyMap(space) KeyEvent.VK_SPACE; keyMap(backspace) KeyEvent.VK_BACK_SPACE; keyMap(a) KeyEvent.VK_A; keyMap(b) KeyEvent.VK_B; keyMap(c) KeyEvent.VK_C; % 继续添加其他按键... if isKey(keyMap, keyName) robot Robot; keyCode keyMap(keyName); robot.keyPress(keyCode); pause(0.05); robot.keyRelease(keyCode); else error(不支持的按键名: %s, keyName); end end这里有个细节containers.Map在MATLAB里默认大小写敏感所以封装时要统一小写。如果传入的keyName是字符串建议用lower处理一下减少调用时的大小写烦恼。3.2 模拟鼠标移动与点击的实现鼠标模拟的核心函数是mouseSimulator.m。它需要实现三个能力获取当前鼠标位置。移动鼠标到任意屏幕坐标。执行单击、双击、右键点击。Java Robot的mouseMove(x, y)是以屏幕左上角为原点单位是像素。与MATLAB的坐标轴不同它不受figure位置影响直接映射到物理屏幕。function mouseSimulator(action, x, y) import java.awt.Robot; import java.awt.event.InputEvent; robot Robot; switch lower(action) case move robot.mouseMove(x, y); case click robot.mouseMove(x, y); robot.mousePress(InputEvent.BUTTON1_MASK); pause(0.05); robot.mouseRelease(InputEvent.BUTTON1_MASK); case rightclick robot.mouseMove(x, y); robot.mousePress(InputEvent.BUTTON3_MASK); pause(0.05); robot.mouseRelease(InputEvent.BUTTON3_MASK); case doubleclick robot.mouseMove(x, y); for i 1:2 robot.mousePress(InputEvent.BUTTON1_MASK); pause(0.05); robot.mouseRelease(InputEvent.BUTTON1_MASK); pause(0.05); end otherwise error(未知鼠标动作: %s, action); end end双击不能只调用一次press/release否则会被系统识别为两次单独单击而不是双击。有些软件会区分单击和双击所以必须控制在短时间内连续点击两次。实际操作中两次点击间隔建议在200毫秒以内太慢会被识别成两次单击。3.3 延时与组合键处理的细节模拟操作中延时控制是成败关键。如果两个按键之间不延时系统可能来不及处理前一个事件造成丢键或界面没反应。我通常在每个动作之间加pause(0.05)也就是50毫秒。对于页面加载、软件启动等耗时操作需要更长的延时可以用pause(1)甚至waitForCondition。组合键处理稍微复杂一点。比如模拟Ctrl C正确顺序是按下Ctrl按下C释放C释放Ctrl顺序不能错。如果先释放Ctrl再释放C某些软件会识别不到复制命令。实现代码import java.awt.Robot; import java.awt.event.KeyEvent; robot Robot; robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_C); pause(0.05); robot.keyRelease(KeyEvent.VK_C); robot.keyRelease(KeyEvent.VK_CONTROL);封装成comboKeys(ctrlc)这样的函数之后读起来很直观。源码包里支持组合键列表通过解析字符串里的加号来拆分。3.4 封装成可复用函数的技巧写源码包和写一次性脚本最大的区别在于接口设计。我建议所有模拟操作都走一个统一入口函数simulateInput.m它接收一个结构体或者参数表然后分发到具体的模拟函数。比如simulateInput(struct(type, key, key, enter)); simulateInput(struct(type, mouse, action, click, x, 800, y, 600)); simulateInput(struct(type, combo, keys, ctrls));这样设计的好处是调用方不需要关心底层函数怎么实现后续哪怕替换成Windows API方案调用代码几乎不用改。另一个技巧是统一加上日志输出在模拟函数里打印当前动作方便定位脚本执行到哪一步。4. 完整实操流程4.1 环境准备在运行源码包之前先确认你的MATLAB版本。由于Java Robot是MATLAB自带Java虚拟机支持的所以理论上R2014b之后的版本都能直接用。Windows、Linux、macOS均可但注意macOS在首次运行时会弹出“允许控制键盘鼠标”的权限提示需要手动到系统设置里开放。我本地测试环境是Windows 11 MATLAB R2023aJava版本为OpenJDK不需要额外安装软件。如果你用的是Linux并且感觉鼠标移动卡顿建议关闭系统的指针加速功能否则mouseMove移动到的位置和预期会有偏差。4.2 导入源码包并配置路径解压源码包后把src目录添加到MATLAB路径中。这一步很关键不然运行示例时会提示找不到函数。命令行执行addpath(genpath(你的路径/matlab模拟键盘鼠标程序源码/src)); savepath;savepath会保存当前路径配置以后启动MATLAB就不用重复添加了。如果不希望改全局路径也可以直接在脚本开头用addpath临时添加。4.3 运行示例脚本在命令行切到examples目录后先运行最简单的一个示例demo_key这段脚本会在当前焦点窗口输出一串测试字符并模拟回车。运行前记得先点击一下记事本或输入框确保焦点在文本区域。如果没反应检查焦点是否被其他窗口抢走。demo_mouse则会把鼠标移动到屏幕坐标(400, 300)并单击。建议先用get(0, ScreenSize)看一下屏幕分辨率别把坐标设到屏幕外。示例auto_typing_demo.m演示了如何把一段字符串逐字键入typeString(Hello, MATLAB!);typeString函数会遍历每个字符通过clipboardPaste方式解决中文输入问题。细说见5.4。4.4 参数调整和扩展实际使用中你大概率需要调整两个参数延时在keySimulator.m和mouseSimulator.m中把pause间隔从0.05秒改到0.1或0.2能提高稳定性。对于需要快速大量输入的场景可以改成0.01但要注意丢键风险。坐标鼠标点击坐标建议从get(0, PointerLocation)实时获取当前鼠标位置避免硬编码。比如先让用户手动把鼠标放到按钮上脚本读取坐标再执行点击。如果需要在不同分辨率的机器上运行建议根据屏幕尺寸做一个比例换算把绝对坐标转成相对坐标。比如写作x round(screenWidth * 0.5)。5. 常见问题与排查技巧5.1 模拟操作无效或目标软件不响应这是我遇到最多的问题。症状是脚本运行不报错但目标软件没反应。排查步骤确认焦点窗口是不是目标软件。可以先用demo_key测试如果记事本能打出字符说明系统级模拟没问题问题出在目标软件拦截了输入。检查目标软件是不是以管理员权限运行。如果MATLAB以普通权限运行而目标程序是管理员权限模拟事件可能因为权限隔离被系统丢弃。解决方案是让MATLAB也以管理员权限启动。有些软件会屏蔽非物理输入比如银行客户端、部分游戏。这时候普通Robot方式无效需要更底层的驱动级模拟但出于安全和合规考虑我不建议在实际工作中绕过这类保护。注意模拟输入只应用于正常自动化办公场景不要用它去绕过登录验证或破解软件限制这类行为既不稳定也不安全。5.2 焦点被抢导致点击坐标失效模拟鼠标点击不一定非要把目标窗口前置但很多软件只有在窗口激活时才会响应点击事件。如果你的脚本要先切换到另一个窗口再点击指定坐标建议在点击前加上窗口激活操作。在Windows上可以用MATLAB的system命令配合PowerShell激活窗口system(powershell -Command Start-Process notepad); pause(1);如果窗口已经打开可以用Win32的SetForegroundWindow但这又涉及到dll调用。常规做法是先用keySimulator(alt)配合tab切换窗口但这样不精确。我一般直接在脚本开头让用户手动点一下目标窗口再用get(0, PointerLocation)读取坐标避免窗口位置变化带来的问题。5.3 运行速度不稳定或丢字符丢字符通常是因为按键间隔太短。尤其当系统负载较高时Java Robot事件队列可能来不及处理。解决办法是增加pause间隔或者在循环里检测一个外部条件。如果是连续输入长字符串typeString函数逐字调用keyPress/keyRelease太慢可以采用剪贴板粘贴的方式clipboard(copy, textToType); comboKeys(ctrlv);这样一次粘贴就完成整段文字输入速度快且不容易丢字符。注意剪贴板会被清空如果剪贴板里有重要内容记得提前备份。5.4 中文和特殊字符输入问题Java Robot的KeyEvent只能模拟键盘上的物理按键直接输入中文字符几乎做不到。我用的方案是剪贴板粘贴。源码包里的clipboardPaste.m实现clipboard(copy, chineseText); comboKeys(ctrlv);这样复制粘贴的字符串不管中文、特殊符号都能稳定输入。同理如果目标软件里需要输入带格式的内容也可以先把内容写到HTML或Word模板里再粘贴。5.5 鼠标移动轨迹和回报率的影响很多鼠标软件支持调节回报率有的达到1000Hz有的只有125Hz。Robot的mouseMove是瞬移不经过物理鼠标的采样所以回报率对移动本身影响不大。但如果你需要模拟平滑移动的轨迹比如画线、拖拽则需要自己插值生成中间点x linspace(x0, x1, 50); y linspace(y0, y1, 50); for i 1:numel(x) robot.mouseMove(round(x(i)), round(y(i))); pause(0.01); end这样才能让目标软件误以为真的是物理鼠标在移动。如果你只是模拟点击直接瞬移就可以速度更快。6. 实际应用场景扩展6.1 自动化测试脚本我在做GUI自动化测试时经常用这套源码包配合MATLAB的appdesigner组件做半自动测试框架。流程是读取测试用例表每个用例包含鼠标坐标、按键序列、预期输出然后脚本依次执行并比对结果。对比Excel中读取的参数和实际界面输出如果一致则测试通过否则记录日志。这种测试方式虽然不如QTP/UFT专业但对于内部小工具足够方便灵活而且可以直接复用MATLAB的数值计算能力做断言。6.2 外部软件交互与数据批量录入如果你经常需要把MATLAB计算好的数据填进另一个软件比如SPSS、Origin、或者某个老旧业务系统手动复制粘贴既慢又容易错。模拟键盘鼠标是一个通用解法MATLAB计算结果保存为表格。用循环逐行读取数据。通过clipboardPaste粘贴到目标软件输入框。模拟回车确认。我曾经一个月要处理近千行数据纯手工需要半天用这段脚本后十分钟搞定。唯一要注意的是目标软件的表单切换逻辑如果每个输入项都要Tab切换脚本里需要精确控制按键顺序。6.3 演示与远程控制辅助有时候要给客户演示某个软件功能鼠标点得太快客户看不清点得太慢又显得生疏。用MATLAB脚本控制可以保持稳定节奏配合pause控制每步间隔还能在关键步骤截图留痕。另外如果你通过远程桌面或虚拟机操作外部环境模拟输入会遇到一些兼容性问题。比如在VirtualBox里鼠标移动可能被宿主机拦截。这时候优先在虚拟机内部运行MATLAB脚本而不是在宿主机控制虚拟机窗口。这也是我踩过几次坑后总结出来的经验。6.4 结合定时器实现无人值守任务把simulateInput和MATLAB的timer结合可以实现每天定时自动操作。比如每天早上自动打开某个报表系统刷新数据截图保存然后关闭。脚本思路function autoTask() startApp(); pause(3); mouseSimulator(click, 200, 300); pause(2); typeString(report); keySimulator(enter); pause(5); captureScreen(); closeApp(); end t timer(TimerFcn, (x,y)autoTask(), StartDelay, 10); start(t);注意定时任务中要增加大量pause等待避免界面加载慢导致操作错位。还可以把异常捕获写在try-catch中出错后发送提醒邮件。7. 源码包扩展建议这套源码包只是起点你可以继续扩展以下功能图像识别定位用MATLAB的findimage或模板匹配自动获取按钮在屏幕上的位置代替硬编码坐标。OCR回读验证用ocr函数识别目标软件界面上的文字判断操作是否成功。多线程任务多个Robot实例并行控制多显示器不同屏幕执行不同操作。如果你打算长期维护建议把参数全部外置到配置文件里使用inputParser校验输入参数并且每个函数都写清楚的帮助注释。这样半年后再回来改代码还能一眼看懂。我个人在实际操作中的体会是模拟键盘鼠标这块真正难的不是代码而是对时序的把握。先确保每一步操作之间有足够的稳定延时再逐步调高速度这样写出的自动化脚本才可靠。最后分享一个小技巧每个模拟动作后加一行fprintf日志执行时肉眼能跟着看进度出问题能立刻定位到是哪一步卡住了。这套源码包在多数场景下已经够用如果能按自己的需求改造后面会越用越顺手。本文还有配套的精品资源点击获取