当前位置: 首页 > news >正文

C++鼠标键盘操作自动化

C++鼠标键盘操作自动化

#pragma once
#include <Windows.h> 
enum KEYS{A = 65,W=87,S=83,D=68,SHIFT=VK_LSHIFT,ALT=18,Tilde= 126,//~TAB=VK_TAB,B=66,SPACE=VK_SPACE,ESC=VK_ESCAPE,Q=81
};
enum MOUSE
{ML,MW,MR//左,中,右
};
class simulator//模拟器
{
public:simulator();simulator(const char* exepath);//启动应用程序static void Key_Down(KEYS key);//模拟键盘按键按下static void Key_UP(KEYS key);//模拟键盘按键抬起static void Key_Click(KEYS key, long mintime);//模拟按键瞬间按下一段时间后抬起static void Mouse_Down(MOUSE key);//模拟鼠标按下static void Mouse_UP(MOUSE key);//模拟鼠标抬起static void Mouse_Click(MOUSE key);//模拟鼠标点击static void Mouse_Move(int x, int y);//模拟鼠标移动x,y数值的距离static void Mouse_Wheel(int value);//模拟鼠标滚轮滚动static POINT Get_Mouse_Position();//得到鼠标位置static void Set_Mouse_Position(int x,int y);//设置鼠标位置static void Get_Mouse_Position(POINT & pos);//得到鼠标位置static void unload_devices();//卸载鼠标键盘,使其不可使用static void reload_devices();//重新启用鼠标键盘
};
class Debuger
{
public:static void print_pos(POINT &pos);static void test_mouse();static void show_all();
};
#include"simulator.h"
#include<stdlib.h>
#include <shlobj.h>
#include<SetupAPI.h>
#include <devguid.h>#pragma comment (lib, "setupapi.lib")
#pragma warning(disable:4996)
extern "C"
{
#include<stdio.h>
}
simulator::simulator()
{
}simulator::simulator(const char * exepath)
{ShellExecute(0, "open", exepath, "", "", 1);
}void simulator::Key_Down(KEYS key)
{keybd_event(key, 0, 0, 0);
}void simulator::Key_UP(KEYS key)
{keybd_event(key, 0, KEYEVENTF_KEYUP, 0);
}void simulator::Key_Click(KEYS key, long mintime)
{Key_Down(key);if (mintime > 0){Sleep(mintime);}Key_UP(key);
}void simulator::Mouse_Down(MOUSE key)
{switch (key){case ML:{mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);}break;case MW:{mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0);}break;case MR:{mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);}break;}
}void simulator::Mouse_UP(MOUSE key)
{switch (key){case ML:{mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);}break;case MW:{mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0);}break;case MR:{mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);}break;}
}void simulator::Mouse_Click(MOUSE key)
{switch (key){case ML:{mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);}break;case MW:{mouse_event(MOUSEEVENTF_MIDDLEDOWN|MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0);}break;case MR:{mouse_event(MOUSEEVENTF_RIGHTDOWN|MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);}break;}
}void simulator::Mouse_Move(int x, int y)
{mouse_event( MOUSEEVENTF_MOVE, x, y, 0, 0);
}void simulator::Mouse_Wheel(int value)
{mouse_event(MOUSEEVENTF_WHEEL, 0, 0, value, 0);
}POINT simulator::Get_Mouse_Position()
{POINT out;GetCursorPos(&out);return out;
}void simulator::Set_Mouse_Position(int x, int y)
{SetCursorPos(x, y);
}void simulator::Get_Mouse_Position(POINT & pos)
{GetCursorPos(&pos);
}void simulator::unload_devices()
{
}void simulator::reload_devices()
{
}void Debuger::print_pos(POINT & pos)
{printf("x:%d  y:%d", pos.x, pos.y);
}void Debuger::test_mouse()
{POINT pt;while (1){simulator::Get_Mouse_Position(pt);Debuger::print_pos(pt);Sleep(1000);}
}void SetDeviceStatus(bool bStatusFlag)
{SP_DEVINFO_DATA DeviceInfoData;DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);//GUID guid;HDEVINFO hDevInfo;// 得到设备 HDEVINFO      hDevInfo = SetupDiGetClassDevs(&(GUID_DEVCLASS_KEYBOARD), 0, 0, DIGCF_PRESENT );if (hDevInfo == INVALID_HANDLE_VALUE){return;}int index = 0;while (SetupDiEnumDeviceInfo(hDevInfo, index++, &DeviceInfoData)){TCHAR szDescBuf[MAX_PATH] = { 0 };//获取设备描述信息if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)szDescBuf, MAX_PATH - 1, NULL)){///*continue*/;return;}puts(szDescBuf);SP_PROPCHANGE_PARAMS propChange;propChange.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);propChange.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;propChange.Scope = DICS_FLAG_GLOBAL;propChange.StateChange = bStatusFlag ? DICS_START : DICS_STOP;propChange.HwProfile = 0;if (SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER*)&propChange, sizeof(propChange))){puts("succ");SetupDiChangeState(hDevInfo, &DeviceInfoData);}printf("%d\n", GetLastError());}//初始化属性SetupDiDestroyDeviceInfoList(hDevInfo);
}
void Debuger::show_all()
{/*SetDeviceStatus(false);Sleep(6000);SetDeviceStatus(true);*/SP_DEVINFO_DATA DeviceInfoData;DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);GUID guid;HDEVINFO hDevInfo;// 得到设备 HDEVINFO      hDevInfo = SetupDiGetClassDevs(&(GUID_DEVCLASS_KEYBOARD), 0, 0, DIGCF_PRESENT );for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++){TCHAR szClassBuf[MAX_PATH] = { 0 };TCHAR szDescBuf[MAX_PATH] = { 0 };TCHAR szDriver[MAX_PATH] = { 0 };TCHAR szFriName[MAX_PATH] = { 0 };// 获取类名  if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_CLASS, NULL, (PBYTE)szClassBuf, MAX_PATH - 1, NULL)){///*continue*/;return;}puts(szClassBuf);//获取设备描述信息if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)szDescBuf, MAX_PATH - 1, NULL)){///*continue*/;return;}puts(szDescBuf);//获取设备驱动名if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DRIVER, NULL, (PBYTE)szDriver, MAX_PATH - 1, NULL)){///*continue*/;return;}puts(szDriver);printf("%x %x %x ", DeviceInfoData.ClassGuid.Data1, DeviceInfoData.ClassGuid.Data2, DeviceInfoData.ClassGuid.Data3);for (int i = 0; i < 8; i++)printf("%x ", DeviceInfoData.ClassGuid.Data4[i]);}
}

相关文章:

C++鼠标键盘操作自动化

C鼠标键盘操作自动化 #pragma once #include <Windows.h> enum KEYS{A 65,W87,S83,D68,SHIFTVK_LSHIFT,ALT18,Tilde 126,//~TABVK_TAB,B66,SPACEVK_SPACE,ESCVK_ESCAPE,Q81 }; enum MOUSE {ML,MW,MR//左&#xff0c;中&#xff0c;右 }; class simulator//模拟器 { pu…...

多个主流Python GUI库全面解析,助你用Python轻松构建精美界面

Python 作为一门易学易用的编程语言&#xff0c;在各个领域都拥有广泛的应用。而 GUI (Graphical User Interface) 编程更是让 Python 变得更加灵活&#xff0c;可以帮助我们创建各种各样的桌面应用&#xff0c;为用户提供直观的交互体验。本文将介绍几个Python GUI 编程中常用…...

Kotlin学习-01创建kotlin学习

安装idea https://www.jetbrains.com/zh-cn/ 创建项目 选择kotlin 修改Main.kt fun main() {print("Hello World!") }运行...

Java、python、php版的企业单位考勤打卡管理系统的设计与实现(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…...

在IntelliJ IDEA中使用Git推送项目

去gitee网站注册用户 gitee网站地址:https://gitee.com/ github网站地址:https://github.com/ 一、创建仓库 以下以gitee为例进行介绍&#xff0c;github操作雷同。 1、创建仓库 点击页面右上方的"“并选择"创建仓库” 2、设置仓库相关信息 首先输入仓库名&…...

CNN代码实战

CNN的原理 从 DNN 到 CNN &#xff08;1&#xff09;卷积层与汇聚 ⚫ 深度神经网络 DNN 中&#xff0c;相邻层的所有神经元之间都有连接&#xff0c;这叫全连接&#xff1b;卷积神经网络 CNN 中&#xff0c;新增了卷积层&#xff08;Convolution&#xff09;与汇聚&#xff08…...

迁移学习代码复现

一、前言 说来可能令人难以置信,迁移学习技术在实践中是非常简单的,我们仅需要保留训练好的神经网络整体或者部分网络,再在使用迁移学习的情况下把保留的模型重新加载到内存中,就完成了迁移的过程。之后,我们就可以像训练普通神经网络那样训练迁移过来的神经网络了。 我们…...

Elasticsearch(ES)常用命令

常用运维命令 一、基本命令1.1、查看集群的健康状态1.2、查看节点信息1.3、查看索引列表1.4、创建索引1.5、删除索引1.6、关闭索引1.7、打开索引1.8、查看集群资源使用情况&#xff08;各个节点的状态&#xff0c;包括磁盘&#xff0c;heap&#xff0c;ram的使用情况&#xff0…...

C/C++ 不定参函数

C语言不定参函数 函数用法总结 Va_list 作用&#xff1a;类型定义&#xff0c;生命一个变量&#xff0c;该变量被用来访问传递给不定参函数的可变参数列表用法&#xff1a;供后续函数进调用&#xff0c;通过该变量访问参数列表 typedefchar* va_list; va_start 作用&#xff…...

C语言——函数专题

1.概念 在C语言中引入函数的概念&#xff0c;有些翻译为子程序。C语言中的函数就是一个完成某项特定任务的一小段代码&#xff0c;这个代码是有特殊的写法和调用方法的。一般我们可以分为两种函数&#xff1a;库函数和自定义函数。 2.库函数 C语言国际标准ANSIC规定了一些常…...

springboot打可执行jar包

1. pom文件如下 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><m…...

【SQL】科目种类

目录 题目 分析 代码 题目 表: Teacher ------------------- | Column Name | Type | ------------------- | teacher_id | int | | subject_id | int | | dept_id | int | ------------------- 在 SQL 中&#xff0c;(subject_id, dept_id) 是该表的主键。 该表…...

【深度学习】【语音】TTS,最新TTS模型概览,扩散模型TTS,MeloTTS、StyleTTS2、Matcha-TTS

文章目录 基础介绍对比基础介绍 MeloTTS: MeloTTS 是 MyShell.ai 开发的一个多语言语音合成模型,支持包括英语、西班牙语、法语、中文、日语和韩语等多种语言。它以高质量的语音合成为特色,尤其擅长处理中英混合内容。该模型优化了在 CPU 上的实时推理能力,使其在多种应用场…...

【论文笔记】LION: Linear Group RNN for 3D Object Detection in Point Clouds

原文链接&#xff1a;https://arxiv.org/abs/2407.18232 简介&#xff1a;Transformer在3D点云感知任务中有二次复杂度&#xff0c;难以进行长距离关系建模。线性RNN则计算复杂度较低&#xff0c;适合进行长距离关系建模。本文提出基于窗口的网络线性组RNN&#xff08;即对分组…...

打造高可用集群的基石:深度解析Keepalived实践与优化

高可用集群 集群类型 集群类型主要分为负载均衡集群&#xff08;LB&#xff09;、高可用集群&#xff08;HA&#xff09;和高性能计算集群&#xff08;HPC&#xff09;三大类。每种集群类型都有其特定的应用场景和优势。 1. 负载均衡集群&#xff08;LB&#xff09; 负载均衡集…...

Web大学生网页作业成品——环保主题介绍网页网站设计与实现(HTML+CSS)(5个页面)

&#x1f389;&#x1f389;&#x1f389; 常见网页设计作业题材有**汽车、环保、明星、文化、国家、抗疫、景点、人物、体育、植物、公益、图书、节日、游戏、商城、旅游、家乡、学校、电影、动漫、非遗、动物、个人、企业、美食、婚纱、其他**等网页设计题目, 可满足大学生网…...

Qt登录窗口设计

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> //图标类 #include <QPushButton> #include <QLineEdit> //行编辑 #include <QLabel> #include <QTextEdit> #include <QMovie>class Widge…...

探索数据矿藏:我的AI大模型与数据挖掘实战经验分享

&#x1f680; 探索数据矿藏&#xff1a;我的AI大模型与数据挖掘实战经验分享 &#x1f496; 前言&#xff1a;数据的金矿&#xff0c;AI的翅膀 在人工智能的浪潮中&#xff0c;我有幸作为项目负责人&#xff0c;带领团队深入挖掘数据的潜力&#xff0c;利用AI大模型的力量&am…...

linux C语言strcat函数及相关函数

讯飞星火 strcat函数是C语言中的一个字符串处理函数,用于将一个字符串追加到另一个字符串的末尾。它的原型如下: char *strcat(char *dest, const char *src);参数说明: dest:目标字符串,即要将src字符串追加到这个字符串的末尾。src:源字符串,即要追加到dest字符串末…...

使用 sort 进行文本文件处理

sort 使用经验笔记 一、简介 sort 是一个命令行工具&#xff0c;用于对文本文件中的行进行排序。它广泛应用于 Unix/Linux 系统中&#xff0c;可以用来对文件的内容进行简单的排序操作&#xff0c;也可以与其他命令结合使用来完成更复杂的任务。 二、基本用法 排序文件: sor…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...