基于C/C++模拟鼠标,可编程鼠标自动操作

1,391 阅读3分钟

前言

Windows支持最多五个按钮的鼠标:左侧、中间和右侧,另外还有两个称为 XBUTTON1 和 XBUTTON2 的按钮。

an illustration that shows the left (1), right (2), middle (3), and xbutton1 (4) buttons.

大多数用于Windows的鼠标至少有左右按钮。 鼠标左键用于指向、选择、拖动等。 鼠标右键通常显示上下文菜单。 一些鼠标在左右按钮之间有一个滚轮。 根据鼠标,滚轮可能也可以单击,使其成为中间按钮。

XBUTTON1 和 XBUTTON2 按钮通常位于鼠标两侧,靠近基础。 这些额外的按钮在所有鼠标上都不存在。 如果存在,则 XBUTTON1 和 XBUTTON2 按钮通常映射到应用程序函数,例如 Web 浏览器中的向前导航和向后导航。

左侧用户通常发现交换左右按钮的功能更舒服—使用右按钮作为指针,左侧按钮显示上下文菜单。 因此,Windows帮助文档使用术语主按钮辅助按钮,该按钮是指逻辑函数而不是物理放置。 在默认 (右手) 设置中,左侧按钮是主按钮,右侧是辅助按钮。 但是,术语 右键单击 , 左键单击 引用逻辑操作。 左键 表示单击主按钮,无论该按钮是鼠标右侧还是左侧。

无论用户如何配置鼠标,Windows都会自动翻译鼠标消息,使其保持一致。 用户可在使用程序中间交换主按钮和辅助按钮,不会影响程序的行为方式。

MSDN 文档使用 术语左侧按钮 和 向右按钮 表示  按钮和 辅助 按钮。 此术语与鼠标输入的窗口消息的名称一致。 只需记住,可能会交换物理左右按钮。

上代码

//#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#include <iostream>
#include <Windows.h>
#include<time.h>

void Mouse_Move(int x, int y)
{
	double fScreenWidth = ::GetSystemMetrics(SM_CXSCREEN) - 1;
	double fScreenHeight = ::GetSystemMetrics(SM_CYSCREEN) - 1;
	double fx = x * (65535.0f / fScreenWidth);
	double fy = y * (65535.0f / fScreenHeight);
	mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, fx, fy, 0, 0);
}

//模拟鼠标点击  (x,y)是要点击的位置 
void LeftClick(int x, int y)
{
	//将鼠标光标移动到 指定的位置     例子中屏幕分辨率1600x900  在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元
	mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, x * 65535 / 1440, y * 65535 / 900, 0, 0);

	Sleep(50);//稍微延时50ms 
	mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//鼠标左键按下 
	mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//鼠标左键抬起
}
void RightClick(int x, int y)
{
	//将鼠标光标移动到 指定的位置     例子中屏幕分辨率1600x900  在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元
	mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, x * 65535 / 1440, y * 65535 / 900, 0, 0);

	Sleep(50);//稍微延时50ms 
	mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);//鼠标左键按下 
	mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);//鼠标左键抬起
}
int main()
{
	//POINT p;
	//::GetCursorPos(&p);
	//Mouse_Move(p.x + 440, p.y + 50);

	srand((unsigned)time(NULL));
	int i;
	while (1) {
		Sleep(3000);
		printf("%d\n", (855 + rand() % 8));
		//RightClick(1270, (855 + rand() % 8));
		RightClick(800, (300 + rand() % 8));
	}
	return 0;
}

本文正在参加「金石计划 . 瓜分6万现金大奖」