前言
在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 提供的模拟函数,在有些游戏中,依旧不会生效.这时候要么自己写驱动,把自己伪装成一个真实的鼠标键盘. 或者购买那种支持自定义发送鼠标键盘事件的硬件设备来实现.