问题求助
功能说明:
本程序是一个使用易语言编写的 Windows 桌面应用程序,主要功能是实现系统级输入消息(如鼠标移动、点击、键盘按键等)的录制与回放。程序的核心技术基于 Windows API 中的全局钩子机制,具体通过调用 `SetWindowsHookEx` 函数挂载不同类型的钩子来完成数据的捕捉和模拟注入。
一、程序架构与核心组件
程序运行在一个标准的图形界面窗口中,包含三个主要的交互按钮(按钮 1、按钮 2、按钮 3),分别对应录制控制的不同阶段。程序内部定义了多个全局变量来管理钩子句柄和数据存储:
1. 变量 `rHook`:用于存储“记录”模式的钩子句柄。
2. 变量 `pHook`:用于存储“回放”模式的钩子句柄。
3. 变量 `索引`:在回放过程中追踪当前执行到哪个录制的数据点。
4. 变量 `动作`:一个动态数组,用于存储所有捕获到的 `MSG`(消息)结构体数据。
二、主要业务流程
程序的逻辑流程清晰,分为录制、停止/查看统计、回放三个阶段,完全由用户点击按钮触发:
1. 开始录制(对应“按钮 1_被单击”)
当用户点击第一个按钮时,程序会初始化 `动作` 数组,并调用 `SetWindowsHookEx` 函数安装一个 `#WH_JOURNALRECORD` 类型的钩子。该钩子的回调函数指向名为 `录制` 的子程序。一旦安装成功,操作系统会将用户的后续输入操作截取下来,并通过钩子通知回调程序。同时,界面上的按钮状态会发生切换,锁定按钮 1 以防止重复录制。
2. 停止录制与查看信息(对应“按钮 2_被单击”)
当用户完成录入后,点击第二个按钮,程序会调用 `UnhookWindowsHookEx` 移除之前的记录钩子。随后,程序会在调试输出窗口打印录制的消息总数(通过 `取数组成员数` 获取),告知用户录制了多少条操作步骤。此步骤标志着录制阶段的结束,数据已保存在内存数组中。
3. 开始回放(对应“按钮 3_被单击”)
当需要复现刚才的操作时,用户点击第三个按钮。程序重置 `索引` 变量为 1,然后调用 `SetWindowsHookEx` 安装一个 `#WH_JOURNALPLAYBACK` 类型的钩子。该钩子的回调函数指向名为 `回放` 的子程序。此时,程序开始根据之前记录的 `动作` 数组内容,按顺序向系统发送消息指令,模拟出当时的操作行为。回放速度可以通过 `延时` 函数的时间参数进行调整。
三、底层技术实现细节
1. 钩子回调机制
程序定义了两个关键的子程序作为钩子回调:
- `录制` 子程序:当系统拦截到输入事件且状态码为 `#HC_ACTION` 时,利用 `CopyMemoryR` 将内存中的数据块复制到临时的 `MSG` 结构体中,并将该结构体加入全局数组 `动作` 末尾。这保证了原始输入信息的完整性。
- `回放` 子程序:当系统查询下一条消息(状态码 `#HC_GETNEXT`)时,利用 `CopyMemoryP` 从 `动作` 数组中取出对应的记录并发送给系统;当系统要求跳过(状态码 `#HC_SKIP`)时,程序会增加计时器延时,提升索引值,从而控制回放节奏。
2. 内存操作
为了处理 Windows 定义的 `MSG` 结构体(包含 20 字节的消息数据),程序中使用了 `kernel32.dll` 中的 `RtlMoveMemory` 函数(封装为 `CopyMemoryR` 和 `CopyMemoryP`)。这种直接内存拷贝的方式避免了复杂的序列化过程,提高了运行效率。
3. 资源清理
程序在窗口销毁事件(`__启动窗口_将被销毁`)中做了防御性编程。无论程序是正常关闭还是异常退出,都会检查 `rHook` 和 `pHook` 是否非零,若是则强制卸载钩子,防止系统资源泄露或导致系统响应延迟。
四、功能总结与应用场景
综上所述,这是一个典型的自动化测试辅助工具或简单的宏录制器原型。它能够记录用户在特定时间段内的鼠标和键盘操作轨迹,并在之后精确地重演这些操作。
此类程序常用于以下场景:
- 软件测试人员用于快速重复执行特定的 UI 操作流程。
- 开发人员用于学习 Windows 消息机制及钩子原理。
- 个人用户用于简化繁琐的重复性手工操作(即宏命令)。
程序虽然代码量不大,但完整展示了 Windows 底层输入钩子的注册、数据捕获、内存管理及卸载的全过程,是理解易语言与 Windows API 交互的良好示例。需要注意的是,由于使用了全局钩子,在运行时可能会对系统产生一定的性能影响,且在某些权限严格的环境下可能需要管理员权限才能正常工作。
======窗口程序集1
| |
| |------ __启动窗口_创建完毕
| |
| |------ _按钮1_被单击
| |
| |------ _按钮2_被单击
| |
| |------ _按钮3_被单击
| |
| |------ 录制
| |
| |------ 回放
| |
| |------ __启动窗口_将被销毁
| |
| |
======调用的Dll
| |
| |---[dll]------ SetWindowsHookEx
| |
| |---[dll]------ CallNextHookEx
| |
| |---[dll]------ CopyMemoryR
| |
| |---[dll]------ CopyMemoryP
| |
| |---[dll]------ UnhookWindowsHookEx
| |
| |---[dll]------ GetWindowLong
| |
| |---[dll]------ GetModuleHandle
注:本站源码主要来源于网络收集。如有侵犯您的利益,请联系我们,我们将及时删除!
部分源码可能含有危险代码,(如关机、格式化磁盘等),请看清代码在运行。
由此产生的一切后果本站均不负责。源码仅用于学习使用,如需运用到商业场景请咨询原作者。
使用本站源码开发的产品均与本站无任何关系,请大家遵守国家相关法律。