一、项目背景
在实际工程中,我们经常让程序像'人'一样操作电脑:
- 自动化测试:点击按钮、输入文本
- 运维/工具:批量操作 GUI 程序
- 辅助工具:快捷操作、脚本化流程
- 教学实验:理解 OS 输入事件链路
这些需求的核心,都是:
程序如何向操作系统'注入'键盘与鼠标输入事件?
1. Windows 输入系统的基本认知
Windows 中,键盘和鼠标并不是直接'给应用'的,而是:
硬件 → 驱动 → 系统输入队列 → 消息分发 → 窗口
只要我们向系统输入队列提交合法事件,系统就会像处理真实硬件一样处理它。
2. 常见实现方式对比
| 方式 | 特点 | 是否推荐 |
|---|---|---|
| keybd_event / mouse_event | 老 API | ❌ 已过时 |
| SendInput | 官方推荐 | ✅ |
| 驱动层 | 复杂/高风险 | ❌ |
| 注入 DLL | 非必要 | ❌ |
本文只使用官方推荐的 SendInput。
3. 本项目目标
实现一个教学 + 工程可用的输入模拟模块,支持:
- 键盘按下 / 抬起
- 鼠标移动
- 鼠标点击(左 / 右)
- 简单组合输入
- 清晰、可复用的封装
二、项目需求
1. 功能需求
实现以下能力:
- 模拟单个键按下与释放
- 模拟字符串输入
- 模拟鼠标移动到屏幕坐标
- 模拟鼠标左键 / 右键点击
- 支持组合示例(键盘 + 鼠标)
2. 技术约束
- 平台:Windows
- 语言:C++(C++11+)
- API:
SendInput - 不依赖第三方库
3. 合规与边界说明
- 仅用于自动化、测试、辅助工具
- 不包含隐藏、绕过、防检测等行为
- 不针对任何未授权系统
三、相关技术
1. SendInput 是什么?
SendInput 是 Windows 提供的统一输入注入接口:
UINT SendInput( UINT cInputs, LPINPUT pInputs, int cbSize );
它可以一次性提交,系统会按顺序处理。

