C++ 鼠标移动录制与回放:精确模拟延迟
要实现录制鼠标的移动并记录延迟,可以使用以下步骤:
- 使用 Windows API 函数
GetCursorPos()获取鼠标的当前位置,并记录下时间戳。 - 将鼠标位置和时间戳记录到一个数据结构中,例如一个
vector。 - 在每个数据点之间计算时间差,记录下延迟。
- 将数据结构保存到文件中,以便之后可以回放。
- 要模拟移动,可以使用 Windows API 函数
SetCursorPos()将鼠标移动到预设的位置。根据记录的时间戳和延迟,可以计算出移动的时间和速度。 - 为了还原移动过程和延迟,可以按照记录的时间戳和延迟来模拟鼠标移动。这样可以确保移动过程和延迟与录制时完全一致。
以下是一个简单的示例代码:
#include <windows.h>
#include <vector>
#include <fstream>
#include <iostream>
using namespace std;
struct MouseData {
POINT pos;
DWORD timestamp;
};
vector<MouseData> mouseData;
void recordMouseMovement() {
while (true) {
POINT pos;
GetCursorPos(&pos);
DWORD timestamp = GetTickCount();
MouseData data = { pos, timestamp };
mouseData.push_back(data);
Sleep(10);
}
}
void saveMouseDataToFile(const char* filename) {
ofstream file;
file.open(filename, ios::binary);
if (file.is_open()) {
int size = mouseData.size();
file.write((char*)&size, sizeof(size));
for (int i = 0; i < size; i++) {
file.write((char*)&mouseData[i], sizeof(MouseData));
}
file.close();
}
}
void playbackMouseMovement(const char* filename) {
ifstream file;
file.open(filename, ios::binary);
if (file.is_open()) {
int size;
file.read((char*)&size, sizeof(size));
for (int i = 0; i < size; i++) {
MouseData data;
file.read((char*)&data, sizeof(MouseData));
DWORD delay = data.timestamp - (i > 0 ? mouseData[i - 1].timestamp : data.timestamp);
Sleep(delay);
SetCursorPos(data.pos.x, data.pos.y);
}
file.close();
}
}
int main() {
HANDLE thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)recordMouseMovement, NULL, 0, NULL);
Sleep(5000); // record for 5 seconds
TerminateThread(thread, 0);
saveMouseDataToFile('mouse_data.bin');
playbackMouseMovement('mouse_data.bin');
return 0;
}
原文地址: https://www.cveoy.top/t/topic/lWNE 著作权归作者所有。请勿转载和采集!