切换语言为:繁体

windows编程: 鼠标键盘模拟

  • 爱糖宝
  • 2024-10-18
  • 2038
  • 0
  • 0

前言

在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;
}

第二种方式是使用SendInputSetCursorPos 来进行鼠标键盘的模拟,这种方式更加通用.缺点是接收的窗口必须激活(置顶). 代码示例如下:

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

0条评论

您的电子邮件等信息不会被公开,以下所有项均必填

OK! You can skip this field.