Python自动化(2)——键盘模拟

Python自动化(2)——键盘模拟

前台键盘模拟

前台键盘模拟和后台键盘模拟的区别在于,是否绑定窗口。即前台模拟是只模拟键盘操作,例如按下按键a,如果聚焦在一个文本文档的编辑区,那么就会把这个a输入进去。但如果是聚焦到了浏览器上的百度翻译编辑区,同样会把a输入进去
下图分别是循环输入10个a的结果(浏览器下建议先将输入法改成英文,否则有可能无反应或者是触发了什么快捷键):
在这里插入图片描述
在这里插入图片描述

实现:
先上代码

import time
import win32api
import win32con
import pyautogui
import pyperclipclass FrontstageKeyBoard():def __init__(self):self.key_map = {"0": 49, "1": 50, "2": 51, "3": 52, "4": 53, "5": 54, "6": 55, "7": 56, "8": 57, "9": 58,'F1': 112, 'F2': 113, 'F3': 114, 'F4': 115, 'F5': 116, 'F6': 117, 'F7': 118, 'F8': 119,'F9': 120, 'F10': 121, 'F11': 122, 'F12': 123, 'F13': 124, 'F14': 125, 'F15': 126, 'F16': 127,"A": 65, "B": 66, "C": 67, "D": 68, "E": 69, "F": 70, "G": 71, "H": 72, "I": 73, "J": 74,"K": 75, "L": 76, "M": 77, "N": 78, "O": 79, "P": 80, "Q": 81, "R": 82, "S": 83, "T": 84,"U": 85, "V": 86, "W": 87, "X": 88, "Y": 89, "Z": 90,'BACKSPACE': 8, 'TAB': 9, 'TABLE': 9, 'CLEAR': 12,'ENTER': 13, 'SHIFT': 16, 'CTRL': 17,'CONTROL': 17, 'ALT': 18, 'ALTER': 18, 'PAUSE': 19, 'BREAK': 19, 'CAPSLK': 20, 'CAPSLOCK': 20, 'ESC': 27,'SPACE': 32, 'SPACEBAR': 32, 'PGUP': 33, 'PAGEUP': 33, 'PGDN': 34, 'PAGEDOWN': 34, 'END': 35, 'HOME': 36,'LEFT': 37, 'UP': 38, 'RIGHT': 39, 'DOWN': 40, 'SELECT': 41, 'PRTSC': 42, 'PRINTSCREEN': 42, 'SYSRQ': 42,'SYSTEMREQUEST': 42, 'EXECUTE': 43, 'SNAPSHOT': 44, 'INSERT': 45, 'DELETE': 46, 'HELP': 47, 'WIN': 91,'WINDOWS': 91, 'NMLK': 144,'NUMLK': 144, 'NUMLOCK': 144, 'SCRLK': 145,'[': 219, ']': 221, '+': 107, '-': 109}print('FrontstageKeyBoard init')# 模拟一次按键的输入,间隔值默认0.1Sdef pressKey(self, key: str, interval=0.1):self.keyDown(key)time.sleep(interval)self.keyUp(key)# 模拟一次组合键的输入,间隔值默认0.1Sdef pressKeys(self, keys, interval=0.1):for i in range (0,len(keys),1):self.keyDown(keys[i], False)time.sleep(interval)for i in range (0,len(keys),1):self.keyUp(keys[i])# 模拟一个按键的按下def keyDown(self, key: str):print('keyDown: ' + str(key))key_code = self.key_map[key.upper()]win32api.keybd_event(key_code, win32api.MapVirtualKey(key_code, 0), win32con.KEYEVENTF_EXTENDEDKEY, 0)# 模拟一个按键的弹起def keyUp(self, key: str):print('keyUp: ' + str(key))key_code = self.key_map[key.upper()]win32api.keybd_event(key_code, win32api.MapVirtualKey(key_code, 0), win32con.KEYEVENTF_KEYUP, 0)# 模拟输入一段文本,只能输入英文或字母def inputText(self, text: str, interval=0.05):print('input text: ' + text)pyautogui.typewrite(text, interval)# 模拟输入一段文本,支持中文,但是实现的方法是通过复制粘贴def inputChineseText(self, text: str):print('input text: ' + text)pyperclip.copy(text)pyautogui.hotkey('Ctrl','v')

这里使用win32api.keybd_event实现键盘模拟按下的操作,实际上前台模拟键盘操作还可以用pykeyboard库、pyautogui库、keyboard库

后台键盘模拟

与前台模拟键盘不同,后台键盘模拟是绑定窗口的,绑定的是窗口句柄,是基于win32api库实现的。后台键盘模拟能做到绑定窗口实现模拟,并且不需要聚焦窗口,简单来说就是不影响正常使用电脑。

先上代码:

import time
import win32api
import win32con
import win32guiclass BackstageKeyBoard():def __init__(self):self.key_map = {"0": 49, "1": 50, "2": 51, "3": 52, "4": 53, "5": 54, "6": 55, "7": 56, "8": 57, "9": 58,'F1': 112, 'F2': 113, 'F3': 114, 'F4': 115, 'F5': 116, 'F6': 117, 'F7': 118, 'F8': 119,'F9': 120, 'F10': 121, 'F11': 122, 'F12': 123, 'F13': 124, 'F14': 125, 'F15': 126, 'F16': 127,"A": 65, "B": 66, "C": 67, "D": 68, "E": 69, "F": 70, "G": 71, "H": 72, "I": 73, "J": 74,"K": 75, "L": 76, "M": 77, "N": 78, "O": 79, "P": 80, "Q": 81, "R": 82, "S": 83, "T": 84,"U": 85, "V": 86, "W": 87, "X": 88, "Y": 89, "Z": 90,'BACKSPACE': 8, 'TAB': 9, 'TABLE': 9, 'CLEAR': 12, 'ENTER': 13, 'SHIFT': 16, 'CTRL': 17,'CONTROL': 17, 'ALT': 18, 'ALTER': 18, 'PAUSE': 19, 'BREAK': 19, 'CAPSLK': 20, 'CAPSLOCK': 20, 'ESC': 27,'SPACE': 32, 'SPACEBAR': 32, 'PGUP': 33, 'PAGEUP': 33, 'PGDN': 34, 'PAGEDOWN': 34, 'END': 35, 'HOME': 36,'LEFT': 37, 'UP': 38, 'RIGHT': 39, 'DOWN': 40, 'SELECT': 41, 'PRTSC': 42, 'printSCREEN': 42, 'SYSRQ': 42,'SYSTEMREQUEST': 42, 'EXECUTE': 43, 'SNAPSHOT': 44, 'INSERT': 45, 'DELETE': 46, 'HELP': 47, 'WIN': 91,'WINDOWS': 91, 'NMLK': 144,'NUMLK': 144, 'NUMLOCK': 144, 'SCRLK': 145,'[': 219, ']': 221, '+': 107, '-': 109}print('BackstageKeyBoard init')def bind(self, hwnd):self.hwnd = hwnd# 后台模拟方法1——使用SendMessage(默认)  ############################################# 模拟一次按键的输入,间隔值默认0.1Sdef pressKey(self, key: str, interval=0.1):self.keyDown(key)time.sleep(interval)self.keyUp(key)# 模拟一次组合键的输入,间隔值默认0.1Sdef pressKeys(self, keys, interval=0.1):for i in range (0,len(keys),1):self.keyDown(keys[i])time.sleep(interval)for i in range (0,len(keys),1):self.keyUp(keys[i])# 模拟一个按键的按下def keyDown(self, key: str):print('keyDown: ' + str(key))key_code = self.key_map[key.upper()]win32api.SendMessage(self.hwnd, win32con.WM_KEYDOWN, key_code, 0)# 模拟一个按键的弹起def keyUp(self, key: str):print('keyUp: ' + str(key))key_code = self.key_map[key.upper()]win32api.SendMessage(self.hwnd, win32con.WM_KEYUP, key_code, 0)# 模拟输入一段文本def inputText(self, text: str):print('input text: ' + text)for ch in text:win32gui.SendMessage(self.hwnd, win32con.WM_CHAR, ord(ch), 0)time.sleep(0.05)# 后台模拟方法2——使用PostMessage  ############################################# 模拟一次按键的输入,间隔值默认0.1Sdef pressKey_2(self, key: str, interval=0.1):self.keyDown_2(key)time.sleep(interval)self.keyUp_2(key)# 模拟一次组合键的输入,间隔值默认0.1Sdef pressKeys_2(self, keys, interval=0.1):for i in range (0,len(keys),1):self.keyDown_2(keys[i])time.sleep(interval)for i in range (0,len(keys),1):self.keyUp_2(keys[i])# 模拟一个按键的按下def keyDown_2(self, key: str):print('keyDown_2: ' + str(key))key_code = self.key_map[key.upper()]win32api.PostMessage(self.hwnd, win32con.WM_KEYDOWN, key_code, 0)# 模拟一个按键的弹起def keyUp_2(self, key: str):print('keyUp_2: ' + str(key))key_code = self.key_map[key.upper()]win32api.PostMessage(self.hwnd, win32con.WM_KEYUP, key_code, 0)# 模拟输入一段文本def inputText_2(self, text: str):print('input_2 text: ' + text)for ch in text:win32gui.PostMessage(self.hwnd, win32con.WM_CHAR, ord(ch), 0)time.sleep(0.05)

上面的代码中,有使用SendMessage和PostMessage来实现的键盘模拟,其中,SendMessage是会等待函数执行后再返回,而PostMessage发送消息后会立即返回。一般情况下,这两种方法并无太大区别。

SendMessage方法的函数原型:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
参数:
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
返回值:返回值指定消息处理的结果,依赖于所发送的消息。
PostMessage方法的函数原型与SendMessage基本一致,不同的是PostMessage的返回值为BOOL类型。
使用后台键盘模拟,需要绑定窗口句柄,关于窗口句柄的获取,可以看看下面这篇文章:
Python自动化(1)——获取窗口句柄

完整自动化工程代码:https://gitee.com/chj-self/PythonRobotization

大佬们找到问题欢迎拍砖~

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

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

相关文章

前端面试js高频手写大全

res.push(fn(arr[i])) } return res } 3. reduce实现数组的map方法 Array.prototype.myMap function(fn,thisValue){ var res []; thisValue thisValue||[]; this.reduce(function(pre,cur,index,arr){ return res.push(fn.call(thisValue,cur,index,arr)); },[])…

云计算考试题

Cloud ❀ 云计算-虚拟化常见的两种架构_裸金属架构和宿主型架构的区别-CSDN博客 为啥要成2 11 bcd 16 acd abcd BCD NAS为啥支持文件存储的协议 选BCD 什么是网络文件系统 选bcd 错题 选abc 选bcd 选 abd

Spring Cloud Gateway网关下的文档聚合(knife4j)

文章目录 引言I 服务发现自动聚合(discover)1.1 配置1.2 服务发现的路由聚合策略-数据来源1.3 编写动态路由实现类1.4 依赖II 其他2.1 网关动态加载swagger路由和配置2.2 无法处理 lb://URI,返回503错误。2.3 SpringBoot3 解决NoResourceFoundException: No static resource f…

让PG停摆一周的大会?2024 PGConf.dev 技术大盘点(下)

PGCon.Dev 的前身是 PGCon —— 最知名的 PostgreSQL Hacker 年度聚会,也可以说是决定 PostgreSQL 未来的会议。从 2007 年成立以来,一直都是在加拿大渥太华举办至今。 有多隆重呢?PG 核心组的 Peter Eisentraut 在会后做了一个统计&#xff…

建筑驱鸟设备 | 建筑专用超声波驱鸟器

从半夜的鸣叫到频繁的鸟粪污染,鸟类活动有时会成为城市居民不得不面对的小小困扰。通过合理的驱鸟方法,我们可以有效地减少鸟类对建筑物的侵扰,保护建筑物的完好和安全,同时维护城市居民的生活质量。 建筑专用超声波驱鸟器&#x…

为什么伦敦金新手不能用一小时图及以下的时间周期?

刚进入伦敦金市场的投资者,一般不建议使用较低的时间周期,如1小时图或以下。不仅如此,新手或者兼职投资者会被要求使用较高的时间周期交易,如4小时图或日线图,这有什么道理呢?下面我们就来讨论一下。 新手的…

从零开始如何学习人工智能?

说说我自己的情况:我接触AI的时候,是在研一。那个时候AlphaGo战胜围棋世界冠军李世石是大新闻,人工智能第一次出现我面前,当时就想搞清楚背后的原理以及这些技术有什么作用。 就开始找资料,看视频。随着了解的深入&am…

社区团购系统智慧门店物流配送系统开发,支持小程序公众号。

目录 前言: 一、为什么要做社区团购小程序? 二、怎么做一个社区团购小程序? 三、制作属于自己的社区团购小程序有什么好处? 总结: 前言: 社区团购是针对小区居民或群体开发的在线购物平台,…

win10手动安装stable-diffusion-webui

目录 1.python下载安装 2.git下载安装 3.stable-diffusion-webui下载 4.安装s-d-webui的依赖包(用国内镜像提速) 5.git下载的stable-diffusion-webui,依赖包提示已安装,但运行webui-user.bat后,又开始下载 6.修…

RedTail 僵尸网络积极利用新漏洞发起攻击

自从 Palo Alto 的 PAN-OS 漏洞公开披露以来,研究人员发现已有攻击者将该漏洞纳入武器库中。 CVE-2024-3400 2024 年 4 月 11 日,Palo Alto 发布公告称基于 PAN-OS 的产品中存在的 0day 漏洞已经被攻击者利用,安全公司 Volexity 已经发现了…

配置 python 脚本操作Excel 环境

在已装python的前提下 一、安装依赖库 pip install pandas pip install openpyxl安装完后,可以在 Python 中运行以下命令来查看 pandas 或 openpyxl 的安装路径: import pandas as pd print(pd.__path__)import openpyxl print(openpyxl.__path__)二、测…

LearnOpenGL - Android OpenGL ES 3.0 绘制纹理

系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGLLearnOpenGL 笔记 - 入门 02 创建窗口LearnOpenGL 笔记 - 入门 03 你好,窗口LearnOpenGL 笔记 - 入门 04 你好,三角形OpenGL - 如何理解 VAO 与 VBO 之间的关系LearnOpenGL - Android OpenGL ES 3.0 绘制…

光纤中的数值 2.405 是怎么一回事?

在光纤通信中,光线的传播依赖于纤芯和包层之间的折射率差异。 即,当光线从纤芯入射到界面上时,如果入射角大于临界角 θ0,将发生全反射,没有光能量透射至包层而泄漏出去,此即光纤导光原理。 反映到光纤的端面,在光纤端面的光线,当入射角必须小于光纤的孔径角 α0 ,此时…

高效管理:好用的项目管理工具推荐

在当今快速变化的商业环境中,高效的项目管理工具能够显著提升团队的生产力和项目的成功率,还能有效地跟踪项目进度。所以,一款优秀的项目管理工具首先要具备先进的项目管理理念,支持多种研发管理和项目管理方法论,才能…

名称申请不了商标,可以受保护不!

前几天个网友说要申请注册个商标名称,发来名称让普推商标知产老杨帮忙检索了下,发现有同名的被驳回,而且是做过驳回复审被驳回,而且是绝对理由驳回的,易使消费者对商品的品质等特点产生误认,不得作为商标使…

IntelliJ IDEA 2024 mac/win版:编程利器,智慧之选

IntelliJ IDEA 2024是一款由JetBrains精心打造的集成开发环境(IDE),专为Java等编程语言量身打造,同时支持多种其他语言,为开发者提供了卓越的开发体验。 IntelliJ IDEA 2024 mac/win版获取 这款IDE凭借其出色的智能化和高效性,赢…

红军九大技战法

一、动态对抗,线上社工持续信息追踪 发起攻击前,发起攻击前,尽可能多的搜集攻击目标信息,做到知己知彼,直击目标最脆弱的地方。攻击者搜集关于目标组织的人员信息、组织架构、网络资产、技术框架及安全措施信息&#x…

java基于ssm+jsp 高校四六级报名管理系统

1前台首页功能模块 高校四六级报名管理系统,在系统首页可以查看首页、四六级报名、新闻资讯、我的、跳转到后台、在线客服等内容,如图1所示。 图1系统功能界面图 学生登录、学生注册,在注册页面可以填写学号、密码、姓名、学院、班级、手机、…

现货黄金应用价格行为交易所需要的环境

在现货黄金投资中,投资者常用价格行为交易法来分析走势。简单来说,这种方法就是只看K线和支撑阻力位,顶多加一些简单的指标,以此构建分析和交易的系统。由于价格行为简单易学,现在的投资者或多或少都在使用这个方法。但…

短视频批量下载工具源码逻辑解析(软件)

短视频批量提取第三篇关于视频提取下载的思路 一:概述 因为上一篇不完整,这里其实就是补充第二篇关于源码思路。这里不针对视频评论的提取,只对视频分享链接批量导入下载进行思路解析 二:难点 通常情况下如果直接访问详情页进行…