前言
在windows中,操作鼠标键盘模拟.比较好的方式是使用PostMessage,通过消息来进行鼠标键盘的操作,但是这种方式很多游戏都会进行拦截,或者说不一定可行.好处是窗口不需要激活即可以进行脚本的模拟运行.
使用PostMessage模拟的示例如下:
#include <windows.h>
#include <iostream>
// 模拟鼠标移动
void SimulateMouseMove(HWND hwnd, int x, int y) {
// 将坐标转换为屏幕坐标
POINT pt;
pt.x = x;
pt.y = y;
// 将坐标转换为目标窗口的客户区坐标
ScreenToClient(hwnd, &pt);
// 发送鼠标移动消息
PostMessage(hwnd, WM_MOUSEMOVE, MK_LBUTTON, MAKELPARAM(pt.x, pt.y));
}
// 模拟鼠标点击
void SimulateMouseClick(HWND hwnd) {
// 模拟鼠标左键按下
PostMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(500, 500));
// 模拟鼠标左键释放
PostMessage(hwnd, WM_LBUTTONUP, 0, MAKELPARAM(500, 500));
}
// 模拟键盘输入
void SimulateKeyPress(HWND hwnd, WPARAM key) {
// 模拟按键按下
PostMessage(hwnd, WM_KEYDOWN, key, 0);
// 模拟按键释放
PostMessage(hwnd, WM_KEYUP, key, 0);
}
int main() {
// 获取目标窗口句柄(如记事本)
HWND hwnd = FindWindow(NULL, L"Untitled - Notepad"); // 根据窗口标题查找
if (hwnd == NULL) {
std::cerr << "Target window not found!" << std::endl;
return 1;
}
std::cout << "Simulating mouse movement, click and keyboard input..." << std::endl;
// 模拟鼠标移动到 (500, 500)
SimulateMouseMove(hwnd, 500, 500);
// 模拟鼠标点击
SimulateMouseClick(hwnd);
// 模拟按下 'A' 键
SimulateKeyPress(hwnd, 'A'); // 'A' 的虚拟键码
return 0;
}
第二种方式是使用SendInput与SetCursorPos 来进行鼠标键盘的模拟,这种方式更加通用.缺点是接收的窗口必须激活(置顶).
代码示例如下:
#include <windows.h>
#include <iostream>
void SimulateMouseMove(int x, int y) {
// 设置鼠标光标位置
SetCursorPos(x, y);
}
void SimulateMouseClick() {
// 模拟鼠标左键按下
INPUT input = {0};
input.type = INPUT_MOUSE;
input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN; // 鼠标按下
SendInput(1, &input, sizeof(INPUT));
// 模拟鼠标左键释放
input.mi.dwFlags = MOUSEEVENTF_LEFTUP; // 鼠标释放
SendInput(1, &input, sizeof(INPUT));
}
void SimulateKeyPress(WPARAM key) {
// 模拟按键按下
INPUT input = {0};
input.type = INPUT_KEYBOARD;
input.ki.wVk = key; // 设置虚拟键码
SendInput(1, &input, sizeof(INPUT));
// 模拟按键释放
input.ki.dwFlags = KEYEVENTF_KEYUP; // 设置为键释放
SendInput(1, &input, sizeof(INPUT));
}
int main() {
// 示例:移动鼠标到 (500, 500)
std::cout << "Moving mouse to (500, 500)..." << std::endl;
SimulateMouseMove(500, 500);
// 示例:模拟鼠标点击
std::cout << "Simulating mouse click..." << std::endl;
SimulateMouseClick();
// 示例:模拟按下 'A' 键
std::cout << "Simulating key press 'A'..." << std::endl;
SimulateKeyPress('A'); // 'A' 的虚拟键码
return 0;
}
以上2种都是windows API 提供的模拟函数,在有些游戏中,依旧不会生效.这时候要么自己写驱动,把自己伪装成一个真实的鼠标键盘. 或者购买那种支持自定义发送鼠标键盘事件的硬件设备来实现.