AutoHotkey键盘鼠标模拟:keyboard_mouse模块API详解

AutoHotkey键盘鼠标模拟:keyboard_mouse模块API详解

【免费下载链接】AutoHotkey 【免费下载链接】AutoHotkey 项目地址: https://gitcode.com/gh_mirrors/autohotke/AutoHotkey

你是否还在为重复的键盘鼠标操作感到厌烦?想通过脚本自动化日常办公任务却不知从何入手?本文将详细解析AutoHotkey中keyboard_mouse模块的核心API,帮助你轻松实现键盘按键模拟、鼠标点击与移动等自动化操作。读完本文后,你将能够:

  • 掌握键盘按键发送的3种核心方法
  • 实现精准的鼠标点击与移动控制
  • 理解事件模拟的底层工作原理
  • 解决常见的自动化操作兼容性问题

模块概述与核心功能

AutoHotkey的键盘鼠标模拟功能主要由keyboard_mouse.hkeyboard_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)两种输入方式。关键参数说明:

参数类型说明
aVKvk_type虚拟键码,如VK_RETURN(回车)、VK_SPACE(空格)
aSCsc_type扫描码,用于区分左右Ctrl/Shift等键,如SC_LCONTROL(0x01D)
aEventTypeKeyEventTypes事件类型:KEYDOWN(按下)、KEYUP(释放)、KEYDOWNANDUP(按并释放)
aRepeatCountint重复次数,默认为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_eventmouse_eventAPI发送事件。优点是兼容性好,支持所有系统和应用程序;缺点是速度较慢,易被某些安全软件检测。

关键实现位于keyboard_mouse.cppKeyEventMouseEvent函数。

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);

使用流程:

  1. 调用PutKeybdEventIntoArrayPutMouseEventIntoArray填充事件
  2. 必要时调用ExpandEventArray扩展容量
  3. 调用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);

通过调整KeyDelayPressDuration参数优化速度与可靠性。

总结与展望

AutoHotkey的keyboard_mouse模块提供了强大而灵活的键盘鼠标模拟能力,从简单的按键发送到复杂的自动化脚本都能胜任。核心优势在于:

  1. 多模式支持,适应不同应用场景
  2. 精细的设备控制,支持左右键区分和精确坐标
  3. 智能状态管理,自动处理 modifier键状态
  4. 高度兼容性,支持从Windows XP到最新系统

未来发展方向可能包括:

  • 引入AI辅助的输入预测
  • 增强对现代游戏引擎的支持
  • 优化触屏设备的输入模拟

掌握这些API,你可以轻松实现各种自动化场景,从日常办公效率提升到复杂的游戏辅助脚本。建议结合官方文档示例脚本深入学习,探索更多高级用法。

如果你觉得本文有帮助,请点赞、收藏并关注,下期将带来"AutoHotkey GUI自动化高级技巧"。

【免费下载链接】AutoHotkey 【免费下载链接】AutoHotkey 项目地址: https://gitcode.com/gh_mirrors/autohotke/AutoHotkey

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值