前言
在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 提供的模擬函式,在有些遊戲中,依舊不會生效.這時候要麼自己寫驅動,把自己偽裝成一個真實的滑鼠鍵盤. 或者購買那種支援自定義傳送滑鼠鍵盤事件的硬體裝置來實現.