当前位置: 首页 > 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…...

HarmonyOS笔记4:从云数据库获取数据

移动应用获取数据的方式主要有&#xff1a; 1.从网络中获取数据接口API。 2.从华为云数据库获取云数据库的资源。 3.从移动终端直接获取本地的数据 在HarmonyOS笔记3中已经完成了方式一从网络中获取数据接口API的方式。在本篇笔记中&#xff0c;将讨论从云数据库中获取数据。 因…...

QT5生成独立运行的exe文件

目录 1 生成独立运行的exe文件1.1 设置工程Release版本可执行文件存储路径1.2 将工程编译成Release版本 2 使用QT5自带的windeployqt拷贝软件运行依赖项3 将程序打包成一个独立的可执行软件exe4 解决QT5 This application failed to start because no Qt platform plugin could…...

LabVIEW光纤水听器闭环系统

开发了一种利用LabVIEW软件开发的干涉型光纤水听器闭环工作点控制系统。该系统通过调节光源频率和非平衡干涉仪的光程差&#xff0c;实现了工作点的精确控制&#xff0c;从而提高系统的稳定性和检测精度&#xff0c;避免了使用压电陶瓷&#xff0c;使操作更加简便。 项目背景 …...

Shell——流程控制语句(if、case、for、while等)

在 Shell 编程中&#xff0c;流程控制语句用于控制脚本的执行顺序和逻辑。这些语句包括 if、case、for、while 等&#xff0c;它们的使用可以使脚本实现更复杂的逻辑。以下是它们的详细说明和语法结构&#xff1a; 1. if 语句 if 语句用于条件判断&#xff0c;执行符合条件的…...

【redis的大key问题】

在使用 Redis 的过程中&#xff0c;如果未能及时发现并处理 Big keys&#xff08;下文称为“大Key”&#xff09;&#xff0c;可能会导致服务性能下降、用户体验变差&#xff0c;甚至引发大面积故障。 本文将介绍大Key产生的原因、其可能引发的问题及如何快速找出大Key并将其优…...

HighPoint SSD7749M2:128TB NVMe 存储卡实现28 GB/s高速传输

HighPoint Technologies推出了一款全新的SSD7749M2 RAID卡&#xff0c;能够在标准的桌面工作站中安装多达16个M.2 SSD&#xff0c;实现高达128TB的闪存存储。该卡通过PCIe Gen4 x16接口提供高达28 GB/s的顺序读写性能。这些令人瞩目的性能规格伴随着高昂的价格标签。 #### 技术…...

ARM 裸机与 Linux 驱动对比及 Linux 内核入门

目录 ARM裸机代码和驱动的区别 Linux系统组成 内核五大功能 设备驱动分类 内核类型 驱动模块 驱动模块示例 Makefile配置 命令 编码辅助工具 内核中的打印函数 printk 函数 修改打印级别 ​编辑 打印级别含义 驱动多文件编译 示例 模块传递参数 命令行传递参数…...

0101DNS TCP fallback on UDP query timeout disabled-redission-中间件

文章目录 1.问题描述2.临时解决方案 结语 1.问题描述 Springcloud 项目&#xff0c;微服务模块使用redission&#xff0c;启动报错 DNS TCP fallback on UDP query timeout disabled. Upgrade Netty to 4.1.105 or higher.相关软件版本如下 软件版本描述springboot2.7.18spr…...

位运算

x1010 原码&#xff1a;000...1010 &#xff08;一共32位&#xff09; 反码&#xff1a;111...0101 &#xff08;~x&#xff09; 补码&#xff1a;111...0110 &#xff08;反码1&#xff09;&#xff08;-x&#xff09; 1、n 的二进制表示中第 k 位是几 #include<iost…...

MemFire Cloud是否真的可以取代后端

近年来&#xff0c;随着前端技术的迅速发展&#xff0c;前端工程师们越来越多地开始思考一个问题&#xff1a;“我还能不能不依赖后端&#xff1f;” 这种想法并非空穴来风&#xff0c;尤其是随着像MemFire Cloud这样的工具出现&#xff0c;它不仅能让开发者在没有后端的情况下…...

江门网站推广排名/天津seo优化排名

一、default关键字 default关键字&#xff0c;并不是访问修饰符中的default&#xff08;默认的访问权限&#xff0c;不加public、private、protected访问修饰符的情况自动使用&#xff0c;同一包下的类可以访问字段&#xff09;&#xff0c;而是Java8的新特性&#xff0c;defa…...

怎样在网站上做有效的广告投放/网络营销有哪些

人生如逆旅&#xff0c;我亦是行人。 https://user-gold-cdn.xitu.io/2019/1/14/1684b3f12a6bb06f?w4896&h3264&fjpeg&s1620164前言 Spring是一个开放源代码的设计层面框架&#xff0c;它解决的是业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的…...

网站wordpress/黄页网站推广

0. 前言在上一个系列中&#xff0c;我们初步浏览了一下C#的基础知识。这句话的意思就是C#基础知识系列完结了&#xff0c;撒花。当然&#xff0c;并不是因为C#已经讲完了。正是因为我们轻轻地叩开了那扇门&#xff0c;才能看到门后面那瑰丽的世界。那么&#xff0c;门后面有什么…...

网站一片空白/百度网络优化推广公司

&#xff08;1&#xff09;基本特性的概念 特性是一种很特殊的类型&#xff0c;特性提供功能强大的方法&#xff0c;它可以加载到程序集的类型中&#xff0c;而它的类型包括有模块&#xff0c;类&#xff0c;接口&#xff0c;构造函数&#xff0c;方法参数...... &#xff08…...

学做网站好学吗/自己如何做链接推广

文章目录1. HTTP内容协商1.1 什么是内容协商1.2 内容协商的分类1.3 为什么需要内容协商1.4 内容协商标头1.4.1 Accept&#xff08;客户端能够接收的MIME类型&#xff09;1.4.2 Accept-Charset&#xff08;客户端能够接受的字符编码&#xff09;1.4.3 Accept-Encoding&#xff0…...

咸宁网站建设哪家好/东莞全网推广

1、一旦安装HP-ALM成功&#xff0c;ALM可以如下图所示&#xff0c;在开始菜单中启动&#xff0c;如下图所示&#xff1a; 2、安装后&#xff0c;我们还可以通过给将被打开&#xff0c;如下图所示在InternetExplorer和ALM以下URL启动ALM。网址URL&#xff1a;http://localhost:8…...