鹏达建设集团有限公司网站网页设计版权信息代码

news/2025/9/28 9:32:36/文章来源:
鹏达建设集团有限公司网站,网页设计版权信息代码,重庆高端网站seo,企业网站做口碑营销本节将向读者介绍如何使用键盘鼠标操控模拟技术#xff0c;键盘鼠标操控模拟技术是一种非常实用的技术#xff0c;可以自动化执行一些重复性的任务#xff0c;提高工作效率#xff0c;在Windows系统下#xff0c;通过使用各种键盘鼠标控制函数实现动态捕捉和模拟特定功能的…本节将向读者介绍如何使用键盘鼠标操控模拟技术键盘鼠标操控模拟技术是一种非常实用的技术可以自动化执行一些重复性的任务提高工作效率在Windows系统下通过使用各种键盘鼠标控制函数实现动态捕捉和模拟特定功能的操作。 键盘鼠标的模拟是实现自动化的必备流程通常我们可以使用keybd_event()实现对键盘的击键模拟使用SetCursorPos()实现对鼠标的模拟使用两者的配合读者可以很容易的实现对键盘鼠标的控制本节将依次封装实现模拟键盘鼠标控制功能读者可根据自己的实际需求选用不同的函数片段。 12.2.1 模拟键盘按键 模拟按键的核心功能是通过调用keybd_event()函数实现的如下是这段代码的完整实现首先MySetKeyBig()函数该函数用于设置键盘状态是否为大小写用户可以传入一个状态值来设置当前输入法大小写模式MyAnalogKey()函数用于实现模拟键盘按键该函数接收一个英文字符串并自动实现击键操作代码实现并不复杂读者可自行测试功能。 #include windows.h #include iostreamusing namespace std;// 设置键盘大小写状态 为TRUE则切换大写状态,否则切换小写状态 VOID MySetKeyBig(BOOL big FALSE) {// 判断键盘CapsLock键是否开启状态,开启状态则为大写,否则为小写if (GetKeyState(VK_CAPITAL)){// 如果当前键盘状态为大写,要求改小写,则模拟按键CapsLock切换状态if (!big){keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}std::cout [键盘状态] 切换大写 std::endl;}else{// 如果当前键盘状态为小写,要求改大写,则模拟按键CapsLock切换状态if (big){keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}std::cout [键盘状态] 切换小写 std::endl;} }// 模拟键盘按键 VOID MyAnalogKey(char* str) {int iLen 0;char* tmp NULL;INPUT* keys NULL;BOOL bOldState FALSE;// 保存此操作前的键盘状态bOldState (BOOL)GetKeyState(VK_CAPITAL);iLen lstrlen(str);tmp (char*)malloc(iLen);memmove(tmp, str, iLen);for (int i 0; i iLen; i){// 某些符号非直属键盘按键,这里只过滤转换两个,以后用到其它字符自行添加过滤if (tmp[i] ){// 产生一个击键消息步骤:按下-抬起keybd_event(VK_SPACE, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event(VK_SPACE, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}else if (tmp[i] ,){keybd_event(VK_OEM_COMMA, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event(VK_OEM_COMMA, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}else if (tmp[i] a tmp[i] z){// 根据字符大小写切换键盘大小写状态MySetKeyBig(0);// keybd_event只识别大写keybd_event((BYTE)tmp[i] - 32, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event((BYTE)tmp[i] - 32, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}else if ((tmp[i] A tmp[i] Z) || (tmp[i] 0 tmp[i] 9)){MySetKeyBig(1);keybd_event((BYTE)tmp[i], NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event((BYTE)tmp[i], NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}else{keybd_event((BYTE)tmp[i] 64, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event((BYTE)tmp[i] 64, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}Sleep(50);}// 恢复此操作之前的键盘状态MySetKeyBig(bOldState);free(tmp); }int main(int argc, char *argv[]) {Sleep(5000);MyAnalogKey((char*)Love life , Love LyShark WelCome LyShark Cpp Home ...);system(pause);return 0; }读者可自行编译并运行上述代码片段将光标移动到记事本中等待五秒钟则会依次敲击如下所示的键盘按键 12.2.2 设置窗体最大化 如下代码实现了设置一个窗体置顶并将该窗体最大化显示的效果该代码实现原理是通过使用EnumWindows函数传递一个回调函数实现对特定窗体的枚举当找到对应窗体句柄后则将该窗体句柄传递给global_hwnd全局句柄中当获取到Google浏览器句柄之后则通过GetSystemMetrics函数得到当前全屏窗体的像素比通过调用SetWindowPos可将一个窗体设置为置顶显示最后可调用SendMessage函数向特定窗体句柄发送最大化消息使其填充满整个屏幕代码如下所示 #include iostream #include windows.husing namespace std;HWND global_hwnd 0;// 将字符串逆序 char * Reverse(char str[]) {int n strlen(str);int i;char temp;for (i 0; i (n / 2); i){temp str[i];str[i] str[n - i - 1];str[n - i - 1] temp;}return str; }// 窗体枚举回调函数 BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam) {char WindowName[MAXBYTE] { 0 };DWORD ThreadId, ProcessId 0;GetWindowText(hwnd, WindowName, sizeof(WindowName));ThreadId GetWindowThreadProcessId(hwnd, ProcessId);printf(句柄: %-9d -- 线程ID: %-6d -- 进程ID: %-6d -- 名称: %s \n, hwnd, ThreadId, ProcessId, WindowName);// 首先逆序输出字符串,然后比较前13个字符if (strncmp(Reverse(WindowName), emorhC elgooG, 13) 0){global_hwnd hwnd;}return TRUE; }int main(int argc, char* argv[]) {// 枚举Google浏览器句柄EnumWindows(lpEnumFunc, 0);std::cout 浏览器句柄: global_hwnd std::endl;if (global_hwnd ! 0){// 获取系统屏幕宽度与高度 (像素)int cx GetSystemMetrics(SM_CXSCREEN);int cy GetSystemMetrics(SM_CYSCREEN);std::cout 屏幕X: cx 屏幕Y: cy std::endl;// 传入指定的HWND句柄HWND hForeWnd GetForegroundWindow();DWORD dwCurID GetCurrentThreadId();DWORD dwForeID GetWindowThreadProcessId(hForeWnd, NULL);AttachThreadInput(dwCurID, dwForeID, TRUE);// 将该窗体呼出到顶层ShowWindow(global_hwnd, SW_SHOWNORMAL);SetWindowPos(global_hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);SetWindowPos(global_hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);SetForegroundWindow(global_hwnd);AttachThreadInput(dwCurID, dwForeID, FALSE);// 发送最大化消息SendMessage(global_hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0); // 最大化// SendMessage(global_hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); // 最小化// SendMessage(global_hwnd, WM_SYSCOMMAND, SC_CLOSE, 0); // 关闭}system(pause);return 0; }读者可自行编译并运行上述程序此时会将谷歌浏览器全屏并置顶显示输出信息如下图所示 12.2.3 读取与设置剪辑板 读取与设置剪辑版可用于对数据的拷贝与设置调用setClipbar函数并传入一段字符串可实现将传入字符串拷贝到剪辑版的功能使用getClipBoardValue则可实现读取剪辑版中的内容到程序内。 #include iostream #include windows.h #include time.h// 将字符串写入到剪切板 BOOL setClipbar(const char* data) {int contentSize strlen(data) 1;HGLOBAL hMemory; LPTSTR lpMemory;// 打开剪切板if (!OpenClipboard(NULL)){return FALSE;}// 清空剪切板if (!EmptyClipboard()){return FALSE;}// 对剪切板分配内存if (!(hMemory GlobalAlloc(GMEM_MOVEABLE, contentSize))){return FALSE;}// 锁定内存区域if (!(lpMemory (LPTSTR)GlobalLock(hMemory))){return FALSE;}// 复制数据到内存区域,解除内存锁定memcpy_s(lpMemory, contentSize, data, contentSize);GlobalUnlock(hMemory);// 设置剪切板数据if (!SetClipboardData(CF_TEXT, hMemory)){return FALSE;}// std::cout 已复制: data 长度: contentSize std::endl;return CloseClipboard(); }// 获取剪切板内容 char* getClipBoardValue() {// 初始化char* url, *pData;size_t length;// 打开剪切板if (!OpenClipboard(NULL)){return FALSE;}// 获取剪切板内的数据HANDLE hData GetClipboardData(CF_TEXT);if (hData NULL){return FALSE;}// 获取数据长度length GlobalSize(hData);url (char*)malloc(length 1);// 将数据转换为字符pData (char*)GlobalLock(hData);strcpy_s(url, length, pData);// 清理工作url[length] 0;GlobalUnlock(hData);CloseClipboard();// 返回结果并释放内存char* result _strdup(url);free(url);return result; }int main(int argc, char *argv[]) {Sleep(5000);for (size_t i 0; i 10; i){// 填充字符串char MyData[256] { 0 };sprintf(MyData, hello lyshark -- %d, i);// 设置到剪辑版BOOL set_flag setClipbar(MyData);if (set_flag TRUE){// std::cout [*] 已设置 std::endl;// 获取剪辑版char *data getClipBoardValue();std::cout [剪辑版数据] data std::endl;}}system(pause);return 0; }运行上述程序依次实现填充字符串并设置到剪辑版最后再通过getClipBoardValue函数从剪辑版内读出数据如下图所示 本文作者 王瑞 本文链接 https://www.lyshark.com/post/95b1ad6c.html 版权声明 本博客所有文章除特别声明外均采用 BY-NC-SA 许可协议。转载请注明出处

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习网站开发体会与感想定制型网站建设服务器

高兴的是有博友mark了我的文章。我知道mark之后,很少会再来继续关注的。但是从侧面说明了在博友点开博客的同时,他感觉这篇博客是有价值的,是能够弥补他的知识欠缺。一篇博客最重要的是对自己有用,如果再对别人有用,那…

做外贸有哪些好的网站桓台新城建设有限公司网站

区间预测 | Matlab实现GRU-Adaboost-ABKDE的集成门控循环单元自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现GRU-Adaboost-ABKDE的集成门控循环单元自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…

鸿蒙应用开发从入门到实战(十六):线性布局案例

ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文通过简单案例演示如何使用Column和Row组件实现线性布局。线性布局案例:商品列表 大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从…

SQL注入流程

SQL注入流程 1.寻找注入点 得到目标网站的一般信息和技术分析信息之后,就要寻找注入点和测试注入点,这些点位都是与数据库有交互的地方 常用注入点在哪里? 我们一般在三个地方,寻找注入点表单中的输入参数 URL中的…

Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截? - 详解

Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截? - 详解2025-09-28 09:17 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; ov…

完整的GLFW应用程序示例

/** 完整的GLFW应用程序示例* 包含窗口创建、输入处理、渲染循环等所有主要功能* 每行代码都有详细注释,便于学习GLFW的使用*/#include <GLFW/glfw3.h> // GLFW主头文件 #include <iostream> // 用…

网站规划建设实训大型电商网站开发方案

1. 引言 Go&#xff08;也称为Golang&#xff09;是一种开源的编程语言&#xff0c;由Google在2007年启动的项目中开发而来。它是一种静态类型的编译型语言&#xff0c;旨在提供高效、可靠的性能。相比于其他编程语言&#xff0c;Golang具有更高的执行效率和并发能力&#xff…

物理笔记

\(P\cdot V=N\cdot K\cdot T\) \(N\) 为分子数量 \(K\) 为常量 \(1.38\times 10^{-23} J\cdot K^{-1}\) 现在推到温度 \(T\) 代表分子平均动能。 考虑单个分子在正方体内运动 \(\Delta p=2mv_x\) \(F=\frac{\Delta p}{…

基于Python+Vue开发的商城管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Pyt…

HTML5-和-CSS3-迁移即时入门-全-

HTML5 和 CSS3 迁移即时入门(全)原文:zh.annas-archive.org/md5/94106B0DE1B83990A3B43B022F07C0DB 译者:飞龙 协议:CC BY-NC-SA 4.0前言 采用新技术总是一个具有挑战性的过程,特别是当它被视为对流行和广为认可…

HTML5-多人游戏开发-全-

HTML5 多人游戏开发(全)原文:zh.annas-archive.org/md5/58B015FFC16EF0C30C610502BF4A7DA3 译者:飞龙 协议:CC BY-NC-SA 4.0前言 欢迎来到《使用 HTML5 开发多人游戏》。本书将教你如何开发支持多个玩家在同一游戏…

HTML5-地理位置即时操作指南-全-

HTML5 地理位置即时操作指南(全)原文:zh.annas-archive.org/md5/d561e9d990e59031e96fb80bd9bd24f6 译者:飞龙 协议:CC BY-NC-SA 4.0前言 欢迎来到 Instant HTML5 Geolocation How-to。本指南将帮助你快速轻松地使…

暖色网站专项培训网站建设方案

51单片机—————8位单片机 裸机驱动 无系统 linux驱动 有系统 驱动-----反映硬件变化 MCU 微控器 MPU CPU GPU 图像处理 IDE 集成开发环境 peripheral 外设 SOC&#xff1a; system on chip P0&#xff1a;8bit——8个引脚 位运算 & …

哪里有免费的网站网址商城网站栏目

声明 下面的题目作答都是自己认为正确的答案&#xff0c;并非官方答案&#xff0c;如果有不同的意见&#xff0c;可以评论区交流。 这些题目也是笔者从各个地方收集的&#xff0c;感觉有些题目答案并不正确&#xff0c;所以在个别题目会给出自己的见解&#xff0c;欢迎大家讨论…

[Kernel] - Heterogeneous Memory Management (HMM)

[Kernel] - Heterogeneous Memory Management (HMM)Heterogeneous Memory Management (HMM) https://www.kernel.org/doc/html/latest/mm/hmm.html Provide infrastructure and helpers to integrate non-conventional…

GreenPlum - Get field types

GreenPlum - Get field types import psycopg2conn = psycopg2.connect(dbname="your_db",user="your_user",password="your_password",host="your_host",port="5432&qu…

搭建环境

环境的流程 一、介绍环境(在linux搭建) 多有米 jdk+linux+服务器(tomcat)+mysql+代码包 jdk 1.8版本 linux(centos) 服务器 tomcat(目前用) 、apache、nginx 数据库 mysql 数据包(后缀 是.mysql)…

山东建设厅科技处网站python官网下载安装

写在前面 如果只有一个kafka实例的话&#xff0c;那么文章中提到kafka集群kafka实例 一、什么是消息发送者端的ack机制 ack机制&#xff1a;消息确认发送成功的标识 由谁发起该标识&#xff1a;kafka集群 发起该标识的场景&#xff1a;kafka集群确认已经收到了消息。 由谁接收…

20250928

周末了 看了下棕榈 前期好像走了个小五波吧 要涨么?不过大周期看还有个Yc的波段

Easysearch 国产替代 Elasticsearch:8 大核心挑战解读

Easysearch 国产替代 Elasticsearch:8 大核心挑战解读pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…