切換語言為:簡體

windows程式設計: 滑鼠鍵盤模擬

  • 爱糖宝
  • 2024-10-18
  • 2039
  • 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.