python实现文字模拟输入解决某些网站的输入框禁止粘贴文字问题

python实现文字模拟输入解决某些网站的输入框禁止粘贴文字问题
转自 只对无法粘贴中文文字的网页输入框有效

import pyperclip
import pyautogui
import time
from datetime import datetime
import tkinter as tk
from tkinter import scrolledtext
import threading
import win32con
import win32api
import win32gui
import ctypes
from ctypes import wintypes
from pywinauto.keyboard import send_keys# 定义 SendInput 函数需要的结构体
PUL = ctypes.POINTER(ctypes.c_ulong)
class KeyBdInput(ctypes.Structure):_fields_ = [("wVk", ctypes.c_ushort),("wScan", ctypes.c_ushort),("dwFlags", ctypes.c_ulong),("time", ctypes.c_ulong),("dwExtraInfo", PUL)]class HardwareInput(ctypes.Structure):_fields_ = [("uMsg", ctypes.c_ulong),("wParamL", ctypes.c_short),("wParamH", ctypes.c_ushort)]class MouseInput(ctypes.Structure):_fields_ = [("dx", ctypes.c_long),("dy", ctypes.c_long),("mouseData", ctypes.c_ulong),("dwFlags", ctypes.c_ulong),("time",ctypes.c_ulong),("dwExtraInfo", PUL)]class Input_I(ctypes.Union):_fields_ = [("ki", KeyBdInput),("mi", MouseInput),("hi", HardwareInput)]class Input(ctypes.Structure):_fields_ = [("type", ctypes.c_ulong),("ii", Input_I)]class TyperGUI:def __init__(self):self.root = tk.Tk()self.root.title("文字模拟打字工具")self.root.geometry("400x500")# 设置窗口置顶self.root.attributes('-topmost', True)# 添加停止标志self.stop_flag = False# 创建输入区域self.text_area = scrolledtext.ScrolledText(self.root, width=40, height=15)self.text_area.pack(pady=10)# 延迟时间输入self.delay_frame = tk.Frame(self.root)self.delay_frame.pack(pady=5)tk.Label(self.delay_frame, text="延迟开始时间(秒):").pack(side=tk.LEFT)self.delay_var = tk.StringVar(value="3")self.delay_entry = tk.Entry(self.delay_frame, textvariable=self.delay_var, width=10)self.delay_entry.pack(side=tk.LEFT)# 打字间隔时间self.interval_frame = tk.Frame(self.root)self.interval_frame.pack(pady=5)tk.Label(self.interval_frame, text="打字间隔(秒):").pack(side=tk.LEFT)self.interval_var = tk.StringVar(value="0.1")self.interval_entry = tk.Entry(self.interval_frame, textvariable=self.interval_var, width=10)self.interval_entry.pack(side=tk.LEFT)# 按钮框架self.button_frame = tk.Frame(self.root)self.button_frame.pack(pady=5)# 开始按钮self.start_button = tk.Button(self.button_frame, text="开始打字", command=self.start_typing)self.start_button.pack(side=tk.LEFT, padx=5)# 停止按钮self.stop_button = tk.Button(self.button_frame, text="停止打字", command=self.stop_typing, state=tk.DISABLED)self.stop_button.pack(side=tk.LEFT, padx=5)# 添加置顶控制self.topmost_var = tk.BooleanVar(value=True)self.topmost_check = tk.Checkbutton(self.root, text="窗口置顶", variable=self.topmost_var,command=self.toggle_topmost)self.topmost_check.pack(pady=5)# 倒计时标签self.countdown_label = tk.Label(self.root, text="", font=("Arial", 24))self.countdown_label.pack(pady=5)# 状态标签self.status_label = tk.Label(self.root, text="就绪")self.status_label.pack(pady=5)def toggle_topmost(self):"""切换窗口置顶状态"""self.root.attributes('-topmost', self.topmost_var.get())def stop_typing(self):self.stop_flag = Trueself.start_button.config(state=tk.NORMAL)self.stop_button.config(state=tk.DISABLED)self.status_label.config(text="已停止打字")def start_typing(self):# 获取文本内容text = self.text_area.get("1.0", tk.END).strip()if not text:self.status_label.config(text="请输入要打字的文本内容")returnself.stop_flag = Falseself.start_button.config(state=tk.DISABLED)self.stop_button.config(state=tk.NORMAL)# 开始新线程执行打字threading.Thread(target=self.typing_thread, args=(text,), daemon=True).start()def update_countdown(self, remaining):"""更新倒计时显示"""if remaining > 0:self.countdown_label.config(text=str(remaining))self.root.after(1000, self.update_countdown, remaining - 1)else:self.countdown_label.config(text="开始!")self.root.after(1000, lambda: self.countdown_label.config(text=""))def send_input(self, *inputs):nInputs = len(inputs)LPINPUT = Input * nInputspInputs = LPINPUT(*inputs)cbSize = ctypes.c_int(ctypes.sizeof(Input))return ctypes.windll.user32.SendInput(nInputs, pInputs, cbSize)def press_key(self, key_code):extra = ctypes.c_ulong(0)ii_ = Input_I()ii_.ki = KeyBdInput(key_code, 0x48, 0, 0, ctypes.pointer(extra))x = Input(ctypes.c_ulong(1), ii_)self.send_input(x)def release_key(self, key_code):extra = ctypes.c_ulong(0)ii_ = Input_I()ii_.ki = KeyBdInput(key_code, 0x48, 0x0002, 0, ctypes.pointer(extra))x = Input(ctypes.c_ulong(1), ii_)self.send_input(x)def press_and_release(self, key_code):self.press_key(key_code)time.sleep(0.01)self.release_key(key_code)def simulate_ime_input(self, char):# 模拟输入法输入for event in [win32con.WM_IME_COMPOSITION, win32con.WM_IME_CHAR]:win32api.PostMessage(win32gui.GetForegroundWindow(),event,ord(char),0)time.sleep(0.05)def typing_thread(self, text):try:delay = float(self.delay_var.get())interval = float(self.interval_var.get())except ValueError:self.status_label.config(text="请输入有效的数字")returnself.status_label.config(text="准备开始打字...")self.root.after(0, self.update_countdown, int(delay))time.sleep(delay)if self.stop_flag:returnfor char in text:if self.stop_flag:returnif char == '\n':win32api.PostMessage(win32gui.GetForegroundWindow(),win32con.WM_CHAR,win32con.VK_RETURN,0)else:if ord(char) > 127:# 中文字符使用IME输入self.simulate_ime_input(char)else:# ASCII字符直接发送win32api.PostMessage(win32gui.GetForegroundWindow(),win32con.WM_CHAR,ord(char),0)time.sleep(interval)self.status_label.config(text="打字完成!")self.start_button.config(state=tk.NORMAL)self.stop_button.config(state=tk.DISABLED)if __name__ == "__main__":app = TyperGUI()app.root.mainloop() 

z

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

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

相关文章

蓝桥杯---力扣题库第38题目解析

文章目录 1.题目重述2.外观数列举例说明3.思路分析(双指针模拟)4.代码说明 1.题目重述 外观数列实际上就是给你一串数字,我们需要对于这个数据进行一个简单的描述罢了; 2.外观数列举例说明 外观数列都是从1开始的,也…

Linux网卡配置方法

1、查看IP ip a 网卡状态 UP/down 2、查看网关 如果显示route命令未找到需要下载net-tools软件包 route -n 3、查看DNS服务器地址 DNS服务器地址会存放在/etc/resolv.conf文件中 使用cat命令可以查看 cat /etc/resolv.conf 4、修改网卡配置 方法1)编…

DeepSeek使用技巧大全(含本地部署教程)

在人工智能技术日新月异的今天,DeepSeek 作为一款极具创新性和实用性的 AI,在众多同类产品中崭露头角,凭借其卓越的性能和丰富的功能,吸引了大量用户的关注。 DeepSeek 是一款由国内顶尖团队研发的人工智能,它基于先进…

消费电子产品中的噪声对TPS54202的影响

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、概述 在白色家电领域,降压转换器的应用非常广泛,为了实现不同的功能就需要不同的电源轨。TPS542…

无限使用Cursor

原理:运行程序获得15天的免费试用期,重新运行程序重置试用期,实现无限使用。免费的pro账号,一个月有250的高级模型提问次数。 前提:已安装cursor cursor-vip工具:https://cursor.jeter.eu.org?p95d60efe…

Linux之文件IO前世今生

在 Linux之文件系统前世今生(一) VFS中,我们提到了文件的读写,并给出了简要的读写示意图,本文将分析文件I/O的细节。 一、Buffered I/O(缓存I/O)& Directed I/O(直接I/O&#…

【计组】实验五 J型指令设计实验

目录 一、实验目的 二、实验环境 三、实验原理 四、实验任务 代码 一、实验目的 1. 理解MIPS处理器指令格式及功能。 2. 掌握lw, sw, beq, bne, lui, j, jal指令格式与功能。 3. 掌握ModelSim和ISE\Vivado工具软件。 4. 掌握基本的测试代码编写和FPGA开发板使用方法。 …

扩展知识--缓存和分时复用cpu

在多核CPU中,缓存和分时复用CPU是两个重要的概念,它们分别涉及硬件架构和资源管理策略。以下将从缓存的层次结构、工作原理以及分时复用CPU的概念进行详细解释。 一、多核CPU中的缓存 缓存的定义与作用 缓存(Cache)是位于CPU与主…

人工智能:从概念到未来

人工智能:从概念到未来 一、引言 在当今数字化时代,人工智能(Artificial Intelligence,AI)已从科幻小说和电影中的幻想逐渐走进现实,成为推动社会进步和经济发展的关键力量。它正在深刻地改变着我们的生活…

nvm:node 版本管理器

一、先安装git Git 安装完成后执行 git --version查看版本号是否安装成功 二、安装nvm (参考链接:mac 安装nvm详细教程 - 简书) 官网(https://github.com/nvm-sh/nvm/blob/master/README.md)查看最新版本安装命令 …

【1】深入解析 SD-WAN:从思科 SD-WAN 视角看现代网络发展

1. 什么是 SD-WAN? SD-WAN(软件定义广域网,Software-Defined Wide Area Network)是一种基于 SDN(软件定义网络)的广域网技术。它利用软件控制来管理广域网连接、流量和安全策略,从而优化数据传输,提高网络可用性。 传统的广域网(WAN)通常依赖专线(如 MPLS)连接分…

C语言基础学习之环境准备

写在前面 本文看下如何在win环境中使用vs code开发C程序。 1:安装gcc 从这里下载,解压,配置环境变量,执行gcc -v验证: C:\Windows\system32>gcc -v Using built-in specs. COLLECT_GCCgcc COLLECT_LTO_WRAPPERD:/programs/…

LabVIEW之TDMS文件

在很多场合,早期的LabVIEW版本不得不借助常规的数据库来做一些数据管理工作,但常规数据库对于中高速数据采集显然是不合适的,因为高速数据采集的数据量非常大,用一般的数据库无法满足存储数据的要求。 直到TDM(Technical Data Ma…

设置IDEA的内存大小,让IDEA更流畅: 建议设置在 2048 MB 及以上

文章目录 引言I 更改内存设置基于窗口界面进行内存设置修改内存配置文件II IDEA中的一些常见问题及其解决方案引言 方式一:基于窗口界面进行内存设置方式二:修改内存配置文件I 更改内存设置 基于窗口界面进行内存设置 打开IDEA,上方菜单栏 Help > Change Memory Settin…

攻防世界ctf

1.题目名称-文件包含 if(isset($_GET[filename])){$filename $_GET[filename];include($filename);} 通过代码审计,我们发现这存在文件包含漏洞,由于没有很好的进行过滤,所以我们可以通过 URL 参数传递任意文件路径给参数$filename&#…

多线程操作

一.多线程 1.线程的创建 1.继承Thread类,重写run()方法创建线程 2.实现Runnable接口,重写run()方法 3.匿名内部类创建线程 4.匿名内部类实现Runnable接口创建线程 5.[常用]lambda表达式创建线程 2.启动线程 Thread类使用start方法,启动一个线程,对于同一个Thread对象只能…

根文件系统 Debian10【1】移植

1.开发背景 一般根文件系统使用 Busybox 或者是 Buildroot 构建,这样构建出来的文件系统比较小,但是不具备上网功能,扩展性比较差。随着 ARM 的日益强大,ARM 可以搭载更庞大复杂的系统,可以是 Ubuntu 或者 Debian 等发…

OpenSIPS-Dispatcher模块详解:优化SIP流量分发的利器

在 OpenSIPS 中,dispatcher 模块用于实现负载均衡和故障转移。通过 dispatcher 模块,你可以将 SIP 请求分发到一组后端服务器(如媒体服务器、代理服务器等),并根据配置的算法和策略动态调整分发逻辑。 模块功能使用样…

09vue3实战-----引入element-plus组件库中的图标

09vue3实战-----引入element-plus组件库中的图标 1.安装2.引入3.优化 element-plus中的icon图标组件的使用和其他平台组件(如el-button按钮)是不一样的。 1.安装 npm install element-plus/icons-vue2.引入 在这我们只讲述最方便的一种引入方法------完整引入。这需要从elem…

Docker 部署 GitLab

一、下载镜像 docker pull gitlab/gitlab-ce 二、运行容器 docker run -d --name gitlab-20080 \n -p 20443:443 -p 20080:80 -p 20022:22 \n -v /wwwroot/opt/docker/gitlab-20080/etc:/etc/gitlab \n -v /wwwroot/opt/docker/gitlab-20080/log:/var/log/gitlab \n -v /www…