AutoHotkey键盘鼠标模拟:keyboard_mouse模块API详解
【免费下载链接】AutoHotkey 项目地址: https://gitcode.com/gh_mirrors/autohotke/AutoHotkey
你是否还在为重复的键盘鼠标操作感到厌烦?想通过脚本自动化日常办公任务却不知从何入手?本文将详细解析AutoHotkey中keyboard_mouse模块的核心API,帮助你轻松实现键盘按键模拟、鼠标点击与移动等自动化操作。读完本文后,你将能够:
- 掌握键盘按键发送的3种核心方法
- 实现精准的鼠标点击与移动控制
- 理解事件模拟的底层工作原理
- 解决常见的自动化操作兼容性问题
模块概述与核心功能
AutoHotkey的键盘鼠标模拟功能主要由keyboard_mouse.h和keyboard_mouse.cpp实现,提供了从基础按键发送到复杂事件序列的完整解决方案。该模块核心能力包括:
- 多模式输入模拟:支持事件注入(SendEvent)、输入模拟(SendInput)和播放模式(SendPlay)三种发送方式
- 精准设备控制:提供鼠标位置、点击次数、滚动距离的精确控制
- ** modifier键管理**:支持左右Ctrl/Shift/Alt/Win键的独立控制与状态追踪
- 硬件无关抽象:通过虚拟键码(VK)和扫描码(SC)实现跨设备兼容
键盘模拟核心API
SendKey函数:基础按键发送
void SendKey(vk_type aVK, sc_type aSC, modLR_type aModifiersLR, modLR_type aModifiersLRPersistent,
int aRepeatCount, KeyEventTypes aEventType, modLR_type aKeyAsModifiersLR, HWND aTargetWindow,
int aX = COORD_UNSPECIFIED, int aY = COORD_UNSPECIFIED, bool aMoveOffset = false);
SendKey是键盘模拟的基础函数,支持虚拟键码(VK)和扫描码(SC)两种输入方式。关键参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| aVK | vk_type | 虚拟键码,如VK_RETURN(回车)、VK_SPACE(空格) |
| aSC | sc_type | 扫描码,用于区分左右Ctrl/Shift等键,如SC_LCONTROL(0x01D) |
| aEventType | KeyEventTypes | 事件类型:KEYDOWN(按下)、KEYUP(释放)、KEYDOWNANDUP(按并释放) |
| aRepeatCount | int | 重复次数,默认为1 |
示例:发送Ctrl+C复制操作
; 对应C++调用: SendKey(VK_C, 0, MOD_LCONTROL, 0, 1, KEYDOWNANDUP, 0, NULL)
Send, ^c
特殊按键与多媒体键支持
keyboard_mouse.h定义了丰富的特殊按键常量,包括多媒体控制键和浏览器控制键:
#define VK_VOLUME_MUTE 0xAD
#define VK_VOLUME_DOWN 0xAE
#define VK_VOLUME_UP 0xAF
#define VK_MEDIA_NEXT_TRACK 0xB0
#define VK_MEDIA_PREV_TRACK 0xB1
#define VK_MEDIA_STOP 0xB2
#define VK_MEDIA_PLAY_PAUSE 0xB3
示例:模拟按下音量增大键
; 对应C++调用: KeyEvent(KEYDOWNANDUP, VK_VOLUME_UP, 0, NULL, true)
Send {Volume_Up}
鼠标模拟核心API
MouseClick函数:鼠标点击控制
void MouseClick(vk_type aVK // Which button.
, int aX, int aY, int aRepeatCount, int aSpeed, KeyEventTypes aEventType, bool aMoveOffset = false);
MouseClick提供全方位的鼠标点击控制,支持左键、右键、中键及侧键点击。关键参数:
| 参数 | 说明 |
|---|---|
| aVK | 鼠标按键虚拟键码,如VK_LBUTTON(左键)、VK_RBUTTON(右键) |
| aX/aY | 目标坐标,屏幕坐标系 |
| aSpeed | 移动速度(0-100),0表示瞬间移动 |
| aMoveOffset | 是否相对当前位置偏移 |
示例:在(500,500)位置双击左键
; 对应C++调用: MouseClick(VK_LBUTTON, 500, 500, 2, 0, KEYDOWNANDUP, false)
Click 500, 500, 2
MouseMove函数:鼠标移动控制
void MouseMove(int &aX, int &aY, DWORD &aEventFlags, int aSpeed, bool aMoveOffset);
MouseMove实现平滑的鼠标移动控制,支持不同速度设置和相对移动。keyboard_mouse.cpp中实现了基于贝塞尔曲线的平滑移动算法,确保移动轨迹自然。
鼠标滚轮模拟
鼠标滚轮模拟通过MouseEvent函数实现,支持垂直和水平滚动:
void MouseEvent(DWORD aEventFlags, DWORD aData, DWORD aX = COORD_UNSPECIFIED, DWORD aY = COORD_UNSPECIFIED);
使用MOUSEEVENTF_WHEEL标志实现垂直滚动,MOUSEEVENTF_HWHEEL实现水平滚动(Windows Vista及以上)。aData参数指定滚动距离,每120表示一个标准滚动格。
示例:向下滚动3格
; 对应C++调用: MouseEvent(MOUSEEVENTF_WHEEL, -360)
Send {WheelDown 3}
事件发送模式详解
AutoHotkey提供三种事件发送模式,适应不同场景需求:
1. 事件模式(SendEvent)
默认模式,使用keybd_event和mouse_eventAPI发送事件。优点是兼容性好,支持所有系统和应用程序;缺点是速度较慢,易被某些安全软件检测。
关键实现位于keyboard_mouse.cpp的KeyEvent和MouseEvent函数。
2. 输入模式(SendInput)
使用SendInputAPI,将多个输入事件打包发送。优点是速度快、可靠性高,不易被系统拦截;缺点是在某些远程桌面环境下可能失效。
相关代码:
void SendUnicodeChar(wchar_t aChar, modLR_type aModifiers)
{
INPUT u_input[2];
// ... 填充INPUT结构 ...
SendInput(2, u_input, sizeof(INPUT));
}
3. 播放模式(SendPlay)
使用 journal playback hook技术,模拟硬件输入。优点是能绕过大多数安全限制,适用于游戏自动化;缺点是实现复杂,有一定延迟。
高级应用:事件序列与状态管理
事件数组机制
keyboard_mouse.cpp中实现了事件数组机制,可批量发送多个输入事件,减少系统调用开销:
void PutKeybdEventIntoArray(modLR_type aKeyAsModifiersLR, vk_type aVK, sc_type aSC, DWORD aEventFlags, DWORD aExtraInfo);
void PutMouseEventIntoArray(DWORD aEventFlags, DWORD aData, DWORD aX, DWORD aY);
ResultType ExpandEventArray();
void SendEventArray(int &aFinalKeyDelay, modLR_type aModsDuringSend);
使用流程:
- 调用
PutKeybdEventIntoArray或PutMouseEventIntoArray填充事件 - 必要时调用
ExpandEventArray扩展容量 - 调用
SendEventArray发送所有事件
modifier键状态管理
模块通过modLR_type类型跟踪左右 modifier键状态,支持持久化 modifier(保持按下状态跨多个Send调用):
static modLR_type sModifiersLR_persistent = 0; // 持久化 modifier状态
示例:保持Win键按下状态
Send {LWin Down} ; 对应C++: persistent_modifiers_for_this_SendKeys |= MOD_LWIN
; ... 其他操作 ...
Send {LWin Up} ; 对应C++: persistent_modifiers_for_this_SendKeys &= ~MOD_LWIN
常见问题与解决方案
1. 游戏中输入无响应
问题:某些游戏使用DirectInput捕获输入,常规事件模拟无效。
解决:使用SendPlay模式或管理员权限运行脚本。
相关代码:keyboard_mouse.cpp中的PlaybackProc函数实现了journal playback hook。
2. 字符与按键不匹配
问题:不同键盘布局下,按键与字符映射关系变化。
解决:使用CharToVKAndModifiers函数自动适配当前布局:
vk_type CharToVKAndModifiers(TCHAR aChar, modLR_type *pModifiersLR, HKL aKeybdLayout, bool aEnableAZFallback = true);
3. 输入延迟或卡顿
问题:连续发送大量事件导致延迟。
解决:使用SendInput模式,减少事件间延迟:
void DoKeyDelay(int aDelay = (sSendMode == SM_PLAY) ? g->KeyDelayPlay : g->KeyDelay);
通过调整KeyDelay和PressDuration参数优化速度与可靠性。
总结与展望
AutoHotkey的keyboard_mouse模块提供了强大而灵活的键盘鼠标模拟能力,从简单的按键发送到复杂的自动化脚本都能胜任。核心优势在于:
- 多模式支持,适应不同应用场景
- 精细的设备控制,支持左右键区分和精确坐标
- 智能状态管理,自动处理 modifier键状态
- 高度兼容性,支持从Windows XP到最新系统
未来发展方向可能包括:
- 引入AI辅助的输入预测
- 增强对现代游戏引擎的支持
- 优化触屏设备的输入模拟
掌握这些API,你可以轻松实现各种自动化场景,从日常办公效率提升到复杂的游戏辅助脚本。建议结合官方文档和示例脚本深入学习,探索更多高级用法。
如果你觉得本文有帮助,请点赞、收藏并关注,下期将带来"AutoHotkey GUI自动化高级技巧"。
【免费下载链接】AutoHotkey 项目地址: https://gitcode.com/gh_mirrors/autohotke/AutoHotkey
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



