C++模擬鼠標點擊和鍵盤輸入的操作 mouse_event & keybd_event

實際運用,視頻講解

python和C++實現模擬鍵鼠操作實測說明【300英雄】

視頻傳送門:點我

相關環境

操作系統:Win10 企業版
編譯環境:MinGW

相關說明

參考資料:windows API,裏面很詳細,愛死了
使用的Windows API中的 mouse_event()keybd_event()

mouse_event

private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
在這裏插入圖片描述
簡單寫個實例,參考 mouse_event() 控制鼠標操作

#include <Windows.h>
1、這裏是鼠標左鍵按下和鬆開兩個事件的組合即一次單擊:
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )


2、模擬鼠標右鍵單擊事件:
mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 )


3、兩次連續的鼠標左鍵單擊事件 構成一次鼠標雙擊事件:
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )

 
4、使用絕對座標
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0 )
需要說明的是,如果沒有使用MOUSEEVENTF_ABSOLUTE,函數默認的是相對於鼠標當前位置的點,如果dx,和dy,用00表示,這函數認爲是當前鼠標所在的點。

 
5、直接設定絕對座標並單擊
mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 屏幕寬, Y * 65536 / 屏幕高, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 屏幕寬, Y * 65536 / 屏幕高, 0, 0);
其中X,Y分別是你要點擊的點的橫座標和縱座標
ps:求屏幕大小,參考 https://blog.csdn.net/yp18792574062/article/details/88351342

#include <Windows.h>
// 帶標題欄和菜單欄
int width = GetSystemMetrics(SM_CXSCREEN);
int height = GetSystemMetrics(SM_CYSCREEN);

keybd_event

VOID keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,DWORD dwExtralnfo);

在這裏插入圖片描述
下圖轉自:keybd_event模擬鍵盤輸入
在這裏插入圖片描述
簡單實例

#include <Windows.h>
keybd_event(16,0,0,0);//按下Shift鍵
keybd_event('A',0,0,0);//按下a鍵
keybd_event('A',0,KEYEVENTF_KEYUP,0);//鬆開a鍵
keybd_event(16,0,KEYEVENTF_KEYUP,0);//鬆開Shift鍵

實際案例

實現效果:來回走動,並按 ‘q’鍵。ps:管理員運行
main.cpp

// 編譯 g++ main.cpp,管理員運行 a.exe
#include <Windows.h>
#include <iostream>
using namespace std;

int main() {
	// 獲取帶標題欄和菜單欄即全屏像素大小
	int width = GetSystemMetrics(SM_CXSCREEN);
	int height = GetSystemMetrics(SM_CYSCREEN);
	// 睡眠5s,準備時間
	Sleep(5000);
	// 死循環
	while (1) 
	{
		// 移動到絕對位置右擊
		mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP | MOUSEEVENTF_MOVE, 1170 * 65535 / width, 362 * 65535 / height, 0, 0 );
		Sleep(3500);
	
		// 按下'q'鍵
		keybd_event(81, 0, 0, 0);
		keybd_event(81, 0, KEYEVENTF_KEYUP, 0);
		Sleep(500);
		
		// 移動到絕對位置右擊
		mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_RIGHTDOWN  | MOUSEEVENTF_RIGHTUP | MOUSEEVENTF_MOVE, 679 * 65535 / width, 760 * 65535 / height, 0, 0 );
		Sleep(3500);
		
	}
	
	//system("pasue");
	return 0;
}

獲取鼠標當前位置

#include <Windows.h>
#include <iostream>
using namespace std;

int main() {
	// 死循環
	while (1) 
	{
		POINT pt = {0,0};
		GetCursorPos(&pt);
		printf("x=%d,y=%d\n", pt.x,pt.y);
		Sleep(3000);
	}
	
	//system("pasue");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章