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,编译直接 gcc 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>
#include <cstdio>
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("pause");
	return 0;
}

补充

FindWindow + SendMessage 向QQ聊天框循环发送消息

在这里插入图片描述
在这里插入图片描述
消息参考:
SendMessage消息种类大全
SendMessage函数的常用消息及其应用大全

效果图

在这里插入图片描述

1.cpp

// 编译 g++ main.cpp,管理员运行 a.exe
#include <Windows.h>
#include <iostream>
#include <cstdio>
using namespace std;

int main() 
{
	// 窗口名,打开任务管理器,查看名称
    char win_name[100];
    printf("请输入窗口名:");
    scanf("%s", win_name);
    HWND win = FindWindow(NULL, win_name);
    if(0 == win)
    {
        printf("获取窗口句柄失败\n");
        return 0;
    }
	// 循环次数
    int i = 0;
    printf("请输入发送次数:");
    scanf("%d", &i);
    int x = 0, y = 0;
    // 循环
    while(i--)
	{
        x = 370;
        y = 550;
        // (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
        // lParam中 高位为y左移16位,低位为x,相对坐标
        SendMessage(win, WM_LBUTTONDOWN, 0, (y << 16) + x);
        SendMessage(win, WM_LBUTTONUP, 0, (y << 16) + x);
        Sleep(500);

		// 粘贴
        SendMessage(win, WM_PASTE, 0, 0);
        Sleep(500);

        x = 652;
        y = 632;
        SendMessage(win, WM_LBUTTONDOWN, 0, (y << 16) + x);
        SendMessage(win, WM_LBUTTONUP, 0, (y << 16) + x);
        Sleep(500);

        // 回车
        // SendMessage(win, WM_KEYDOWN, VK_RETURN, 0);
		// Sleep(500);

        printf("i=%d\n", i);
	}
	
	//system("pasue");
	return 0;
}

  • 28
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love丶伊卡洛斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值