【開源工具】跳過網頁APP禁止粘貼限制:自動輸入鍵盤模擬工具

📌 【黑科技】跳過網頁APP禁止粘貼限制:自動輸入鍵盤模擬工具

請添加圖片描述

🌈 個人主頁:創客白澤 - CSDN博客
🔥 系列專欄:🐍《Python開源項目實戰》
💡 熱愛不止于代碼,熱情源自每一個靈感閃現的夜晚。愿以開源之火,點亮前行之路。
👍 如果覺得這篇文章有幫助,歡迎您一鍵三連,分享給更多人哦

請添加圖片描述

在這里插入圖片描述

🚀 概述:當自動化遇上可視化

在日常辦公和軟件開發中,我們經常需要處理大量重復的文本輸入工作。傳統的人工輸入不僅效率低下,還容易出錯。本文將介紹如何使用Python的PyQt5庫結合pynput鍵盤控制模塊,開發一款帶可視化倒計時提示的自動輸入工具。

本工具的特色在于:

  • 采用現代化GUI界面設計
  • 輸入前提供5秒可視化倒計時
  • 支持從文件導入文本內容
  • 實時狀態反饋機制
  • 可自定義的窗口置頂功能

相比市面上其他自動化工具,我們的解決方案更加用戶友好安全可控,特別適合以下場景:

  • 自動化測試中的表單填充
  • 批量數據錄入工作
  • 演示時的自動輸入展示
  • 需要延遲執行的文本輸入任務

🔍 功能全景圖

核心功能矩陣

功能模塊技術實現方案用戶體驗亮點
文本編輯區QTextEdit控件支持大文本流暢編輯
文件導入QFileDialog+多編碼處理自動識別GBK/UTF-8編碼
倒計時顯示QDialog+QTimer居中大號紅色數字
鍵盤模擬pynput.keyboard.Controller非侵入式輸入模擬
狀態反饋QLabel動態更新表情符號+顏色狀態指示

技術棧深度

  • PyQt5:Qt框架的Python綁定,提供豐富的GUI組件
  • pynput:底層輸入設備監控庫,支持跨平臺鍵盤控制
  • QThread:實現后臺鍵入操作,避免界面凍結
  • 信號槽機制:解耦UI與業務邏輯的關鍵設計

🎥 效果展示

主界面截圖

在這里插入圖片描述

倒計時動效演示

在這里插入圖片描述

🛠? 使用教程

環境準備

pip install pyqt5 pynput

四步操作指南

  1. 文本準備階段
    • 直接在編輯區粘貼文本
    • 或點擊"導入文件"按鈕選擇TXT文件
  2. 參數設置
    • 勾選"窗口置頂"保持工具在最前端
    • 檢查文本內容是否完整
  3. 執行輸入
    • 點擊"開始輸入"觸發5秒倒計時
    • 倒計時結束后自動開始鍵入
  4. 過程控制
    • 隨時可點擊"停止輸入"中斷操作
    • 狀態欄實時顯示當前進度

💡 專業提示:倒計時期間請將光標移動到目標輸入位置!

🔧 核心代碼解析

1. 倒計時窗口類設計

class CountdownWindow(QDialog):def __init__(self, parent=None):super().__init__(parent)self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)self.setStyleSheet("background-color: black;")# 72pt超大紅色數字font = QFont("Arial", 72, QFont.Bold)self.countdown_label.setFont(font)

設計要點

  • 無邊框窗口確保專注度
  • 黑色背景增強視覺對比
  • 窗口置頂防止被遮擋
  • 使用系統默認等寬字體保證數字顯示整齊

2. 鍵盤輸入線程

class TypeThread(QThread):def run(self):keyboard = Controller()for char in self.text:if not self._is_running:  # 安全停止檢查點breakkeyboard.type(char)  # 非阻塞式鍵入

關鍵技術

  • 繼承QThread實現多線程
  • 每個字符獨立鍵入保證可控性
  • _is_running標志位實現優雅中止

3. 狀態機管理

在這里插入圖片描述

狀態轉換邏輯

  • 通過按鈕的enable/disable控制狀態流轉
  • 統一的狀態欄消息格式:[圖標] 狀態描述
  • 異常狀態自動恢復機制

📥 源碼下載

from PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTextEdit, QWidget, QFileDialog, QMessageBox, QSpinBox, QCheckBox, QDialog)
from PyQt5.QtCore import Qt, QThread, pyqtSignal, QTimer
from PyQt5.QtGui import QFont
from pynput.keyboard import Controller
import time
import sysclass CountdownWindow(QDialog):def __init__(self, parent=None):super().__init__(parent)self.setWindowTitle("倒計時")self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)self.setStyleSheet("background-color: black;")layout = QVBoxLayout()self.countdown_label = QLabel("5")self.countdown_label.setAlignment(Qt.AlignCenter)self.countdown_label.setStyleSheet("color: red;")font = QFont("Arial", 72, QFont.Bold)self.countdown_label.setFont(font)layout.addWidget(self.countdown_label)self.setLayout(layout)# 設置窗口大小并居中self.resize(200, 200)self.move_to_center()def move_to_center(self):screen = QApplication.primaryScreen().geometry()x = (screen.width() - self.width()) // 2y = (screen.height() - self.height()) // 2self.move(x, y)def update_countdown(self, seconds):self.countdown_label.setText(str(seconds))if seconds <= 0:self.close()class TypeThread(QThread):update_signal = pyqtSignal(str)finished_signal = pyqtSignal()def __init__(self, text):super().__init__()self.text = textself._is_running = Truedef run(self):keyboard = Controller()for char in self.text:if not self._is_running:breakkeyboard.type(char)self.finished_signal.emit()def stop(self):self._is_running = Falseclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("自動輸入工具")self.setGeometry(100, 100, 600, 400)# 初始化線程和倒計時窗口self.thread = Noneself.countdown_timer = QTimer()self.countdown_seconds = 5self.countdown_window = None# 創建主部件和布局main_widget = QWidget()main_layout = QVBoxLayout()# 標題title = QLabel("📋 自動輸入工具")title.setAlignment(Qt.AlignCenter)title.setStyleSheet("font-size: 20px; font-weight: bold;")main_layout.addWidget(title)# 說明info = QLabel("🔍 請將文本粘貼到下方或從文件導入")info.setAlignment(Qt.AlignCenter)main_layout.addWidget(info)# 文本編輯區self.text_edit = QTextEdit()self.text_edit.setPlaceholderText("📝 請在此粘貼要輸入的文本...")main_layout.addWidget(self.text_edit)# 控制區域control_layout = QHBoxLayout()# 窗口置頂復選框self.topmost_check = QCheckBox("📌 置頂")self.topmost_check.stateChanged.connect(self.toggle_topmost)control_layout.addWidget(self.topmost_check)# 按鈕btn_layout = QHBoxLayout()self.load_btn = QPushButton("📂 導入文件")self.load_btn.clicked.connect(self.load_from_file)btn_layout.addWidget(self.load_btn)self.start_btn = QPushButton("📝 開始輸入")self.start_btn.clicked.connect(self.start_typing)btn_layout.addWidget(self.start_btn)self.stop_btn = QPushButton("? 停止輸入")self.stop_btn.clicked.connect(self.stop_typing)self.stop_btn.setEnabled(False)btn_layout.addWidget(self.stop_btn)control_layout.addLayout(btn_layout)main_layout.addLayout(control_layout)# 狀態欄self.status_bar = QLabel("🟢 準備就緒")self.status_bar.setAlignment(Qt.AlignCenter)main_layout.addWidget(self.status_bar)main_widget.setLayout(main_layout)self.setCentralWidget(main_widget)# 樣式self.setStyleSheet("""QPushButton {padding: 8px;font-size: 14px;}QTextEdit {font-size: 14px;}""")# 連接倒計時定時器self.countdown_timer.timeout.connect(self.update_countdown)def toggle_topmost(self, state):if state == Qt.Checked:self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)else:self.setWindowFlags(self.windowFlags() & ~Qt.WindowStaysOnTopHint)self.show()def start_countdown(self):self.countdown_seconds = 5self.countdown_window = CountdownWindow(self)self.countdown_window.show()self.countdown_timer.start(1000)  # 1秒間隔self.status_bar.setText(f"? 倒計時: {self.countdown_seconds}秒...")  # 更新狀態欄def update_countdown(self):self.countdown_seconds -= 1self.countdown_window.update_countdown(self.countdown_seconds)self.status_bar.setText(f"? 倒計時: {self.countdown_seconds}秒...")  # 更新狀態欄if self.countdown_seconds <= 0:self.countdown_timer.stop()QTimer.singleShot(500, self.countdown_window.close)  # 稍后關閉窗口self._start_typing_after_delay()def load_from_file(self):file_path, _ = QFileDialog.getOpenFileName(self, "📂 打開文本文件", "", "文本文件 (*.txt);;所有文件 (*)")if file_path:try:# 嘗試用UTF-8編碼打開,如果失敗則用GBK編碼try:with open(file_path, 'r', encoding='utf-8') as f:data = f.read()except UnicodeDecodeError:try:with open(file_path, 'r', encoding='gbk') as f:data = f.read()except UnicodeDecodeError:with open(file_path, 'r', encoding='utf-8', errors='replace') as f:data = f.read()self.text_edit.setPlainText(data)self.status_bar.setText(f"? 成功從 {file_path} 加載文本")except Exception as e:QMessageBox.critical(self, "? 錯誤", f"無法讀取文件: {str(e)}")self.status_bar.setText("? 文件加載失敗")def start_typing(self):if not self.text_edit.toPlainText().strip():QMessageBox.warning(self, "?? 警告", "請輸入或導入文本內容!")returnself.status_bar.setText("? 準備開始輸入...")self.start_btn.setEnabled(False)self.stop_btn.setEnabled(True)self.load_btn.setEnabled(False)# 開始倒計時self.start_countdown()def _start_typing_after_delay(self):text = self.text_edit.toPlainText()self.thread = TypeThread(text)self.thread.finished_signal.connect(self.typing_finished)self.thread.start()self.status_bar.setText("?? 正在輸入中...請勿操作鍵盤!")def stop_typing(self):if self.thread and self.thread.isRunning():self.thread.stop()self.thread.wait()# 如果倒計時還在進行也停止if self.countdown_timer.isActive():self.countdown_timer.stop()if self.countdown_window:self.countdown_window.close()self.typing_finished()self.status_bar.setText("🟡 輸入已停止")def typing_finished(self):self.start_btn.setEnabled(True)self.stop_btn.setEnabled(False)self.load_btn.setEnabled(True)self.status_bar.setText("? 輸入完成!")def closeEvent(self, event):# 停止所有正在進行的操作if self.thread and self.thread.isRunning():self.thread.stop()self.thread.wait()if self.countdown_timer.isActive():self.countdown_timer.stop()if self.countdown_window:self.countdown_window.close()event.accept()if __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

文件結構

auto-typer/
├── main.py            # 主程序入口
├── requirements.txt   # 依賴清單
└── README.md          # 項目文檔

💡 開發心得

遇到的坑與解決方案

  1. 編碼問題
    • 現象:中文文本輸入亂碼
    • 排查:發現pynput對Unicode支持需要特定處理
    • 解決:在文本預處理階段統一轉為UTF-8
  2. 線程沖突
    • 現象:界面在輸入時卡頓
    • 分析:GUI線程與輸入線程資源競爭
    • 優化:采用信號槽進行跨線程通信
  3. 焦點丟失
    • 現象:倒計時后輸入位置錯誤
    • 方案:增加倒計時結束前的焦點檢查提示

性能優化點

  • 使用QTextEdit的逐行加載機制處理大文件
  • 實現鍵入速度動態調節接口
  • 添加輸入歷史記錄功能

🎯 未來擴展方向

  1. 企業級功能
    • 增加用戶權限管理系統
    • 添加操作日志審計功能
    • 支持LDAP集成認證
  2. AI增強
    • 集成OCR識別自動輸入
    • 添加語音控制接口
    • 智能表單識別填充
  3. 云化部署
    • 開發WebSocket遠程控制
    • 實現移動端APP監控
    • 增加多設備同步功能

📚 推薦學習資源

  1. 官方文檔
    • PyQt5權威指南
    • pynput API參考
  2. 進階書籍
    • 《PyQt5快速開發與實戰》
    • 《Python GUI設計之道》
  3. 相關項目
    • AutoHotkey開源社區
    • Selenium自動化框架

?? 作者寄語:自動化工具開發的本質是"將重復勞動轉化為創造性工作"。希望本項目能幫助大家從繁瑣的鍵盤操作中解放出來,把寶貴的時間用在更有價值的事情上。如果覺得有用,請給個?鼓勵!

版權聲明:本文采用CC BY-NC-SA 4.0協議,轉載請注明出處。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85436.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85436.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85436.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習篇---face-recognition的優劣點

face_recognition庫是一個基于 Python 的開源人臉識別工具&#xff0c;封裝了 dlib 庫的深度學習模型&#xff0c;具有易用性高、集成度強的特點。以下從技術實現、應用場景等維度分析其優劣勢&#xff1a; 一、核心優勢 1. 極簡 API 設計&#xff0c;開發效率極高 代碼量少…

Git深入解析功能邏輯與核心業務場景流程

一、Git核心功能邏輯架構 #mermaid-svg-9tj1iCr99u6QenJM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9tj1iCr99u6QenJM .error-icon{fill:#552222;}#mermaid-svg-9tj1iCr99u6QenJM .error-text{fill:#552222;st…

【大模型】情緒對話模型項目研發

一、使用框架&#xff1a; Qwen大模型后端Open-webui前端實現使用LLamaFactory的STF微調數據集&#xff0c;vllm后端部署&#xff0c; 二、框架安裝 下載千問大模型 安裝魔塔社區庫文件 pip install modelscope Download.py 內容 from modelscope import snapshot_downlo…

Java基礎 Day26

一、網絡編程簡介 1、概念 網絡編程指在網絡通信協議下&#xff0c;不同計算機上運行的程序&#xff0c;進行數據傳輸 2、軟件架構 &#xff08;1&#xff09;CS架構&#xff08;客戶端和服務端&#xff09; 在用戶本地有一個客戶端程序&#xff0c;在遠程有一個服務器端程…

【Hot 100】45. 跳躍游戲 II

目錄 引言跳躍游戲 IIdp解題貪心解題 &#x1f64b;?♂? 作者&#xff1a;海碼007&#x1f4dc; 專欄&#xff1a;算法專欄&#x1f4a5; 標題&#xff1a;【Hot 100】45. 跳躍游戲 II?? 寄語&#xff1a;書到用時方恨少&#xff0c;事非經過不知難&#xff01; 引言 跳躍…

計算機網絡第1章(上):網絡組成與三種交換方式全解析

目錄 一、計算機網絡的概念二、計算機網絡的組成和功能2.1 計算機網絡的組成2.2 計算機網絡的功能 三、電路交換、報文交換、分組交換3.1 電路交換&#xff08;Circuit Switching&#xff09;3.2 報文交換&#xff08;Message Switching&#xff09;3.3 分組交換&#xff08;Pa…

[總結]前端性能指標分析、性能監控與分析、Lighthouse性能評分分析

前端性能分析大全 前端性能優化 LightHouse性能評分 性能指標監控分析 瀏覽器加載資源的全過程性能指標分析 性能指標 在實現性能監控前&#xff0c;先了解Web Vitals涉及的常見的性能指標 Web Vitals 是由 Google 推出的網頁用戶體驗衡量指標體系&#xff0c;旨在幫助開發者量…

Windows商店中的免費掃雷游戲應用

《掃雷》是一款經典的單人益智小游戲&#xff0c;1992年微軟發布的Windows 3.1中加入該游戲&#xff0c;從此風靡全世界。游戲目標是通過邏輯推理&#xff0c;在最短的時間內根據點擊格子出現的數字找出所有非雷格子&#xff0c;同時避免踩雷。 此Windows應用實現了經典掃雷的…

ActiveMQ 可觀測性最佳實踐

ActiveMQ 介紹 ActiveMQ 是一款高性能、開源的消息中間件&#xff0c;支持多種消息協議&#xff08;如 JMS、AMQP、MQTT 等&#xff09;&#xff0c;能夠實現應用程序之間的異步通信和消息傳遞。它提供點對點&#xff08;Queue&#xff09;和發布/訂閱&#xff08;Topic&#…

【Linux命令】scp遠程拷貝

文章目錄 1. 基本語法與常用選項2. 使用場景和使用示例本地文件->遠程主機遠程主機文件->本地遠程主機->另一臺遠程主機 3. 使用注意事項 scp&#xff08;Secure Copy Protocol&#xff09;是linux中基于ssh的安全文件傳輸工具&#xff0c;用于在本地和遠程主機之前安…

如何優化 Harmony-Cordova 應用的性能?

以下是針對 ?Harmony-Cordova 應用性能優化?的完整方案&#xff0c;結合鴻蒙原生特性和Cordova框架優化策略&#xff1a; ??一、渲染性能優化? ?減少布局嵌套層級? 使用扁平化布局&#xff08;如 Grid、GridRow&#xff09;替代多層 Column/Row 嵌套&#xff0c;避免冗…

c++學習之---模版

目錄 一、函數模板&#xff1a; 1、基本定義格式&#xff1a; 2、模版函數的優先匹配原則&#xff1a; 二、類模板&#xff1a; 1、基本定義格式&#xff1a; 2、類模版的優先匹配原則&#xff08;有坑哦&#xff09;&#xff1a; 3、缺省值的設置&#xff1a; 4、ty…

SpringAI(GA):RAG下的ETL快速上手

原文鏈接&#xff1a;SpringAI(GA)&#xff1a;RAG下的ETL快速上手 教程說明 說明&#xff1a;本教程將采用2025年5月20日正式的GA版&#xff0c;給出如下內容 核心功能模塊的快速上手教程核心功能模塊的源碼級解讀Spring ai alibaba增強的快速上手教程 源碼級解讀 版本&a…

用dayjs解析時間戳,我被提了bug

引言 前幾天開發中突然接到測試提的一個 Bug&#xff0c;說我的時間組件顯示異常。 我很詫異&#xff0c;這里初始化數據是后端返回的&#xff0c;我什么也沒改&#xff0c;這bug提給我干啥。我去問后端&#xff1a;“這數據是不是有問題&#xff1f;”。后端答&#xff1a;“…

DataAgent產品經理(數據智能方向)

DataAgent產品經理&#xff08;數據智能方向&#xff09; 一、核心崗位職責 AI智能體解決方案設計 面向工業/政務場景構建「數據-模型-交互」閉環&#xff0c;需整合多源異構數據&#xff08;如傳感器數據、業務系統日志&#xff09;與AI能力&#xff08;如大模型微調、知識圖…

Ubuntu取消開機用戶自動登錄

注&#xff1a;配置前請先設置登錄密碼&#xff0c;不同顯示管理器配置方法不同&#xff0c;可用命令查看&#xff1a;cat /etc/X11/default-display-manager 一、LightDM 顯示管理器&#xff0c;關閉 Ubuntu 系統用戶自動登錄 查找自動登錄配置文件&#xff0c;可以看到類似 a…

使用lighttpd和開發板進行交互

文章目錄 &#x1f9e0; 一、Lighttpd 與開發板的交互原理1. 什么是 Lighttpd&#xff1f;2. 與開發板交互的方式&#xff1f; &#x1f9fe; 二、lighttpd.conf 配置文件講解?? 注意事項&#xff1a; &#x1f4c1; 三、目錄結構說明&#x1f4a1; 四、使用 C 編寫 CGI 腳本…

Apache IoTDB V2.0.3 發布|新增元數據導入導出腳本適配表模型功能

Release Announcement Version 2.0.3 Apache IoTDB V2.0.3 已經發布&#xff01; V2.0.3 作為樹表雙模型正式版本&#xff0c;主要新增元數據導入導出腳本適配表模型、Spark 生態集成&#xff08;表模型&#xff09;、AINode 返回結果新增時間戳&#xff0c;表模型新增部分聚…

車輛檢測算法在爆炸事故應急響應中的優化路徑

視覺分析賦能車輛管控&#xff1a;以山東應急場景為例 背景&#xff1a;應急場景下的車輛管控痛點 近期山東多起爆炸事故暴露了應急響應中的車輛管理短板&#xff1a;消防車、救護車因違停車輛堵塞通道&#xff0c;違規車輛闖入事故核心區&#xff0c;傳統監控系統依賴人工識別…

∑ 1/n 調和級數 是 發散的

為什么 ∑ 1 u \sum \frac{1}{u} ∑u1?&#xff08;即 ∑ 1 n \sum \frac{1}{n} ∑n1?&#xff0c;通常稱為調和級數&#xff09;是發散的&#xff1f; ? 一、首先明確你問的是這個級數&#xff1a; ∑ n 1 ∞ 1 n \sum_{n1}^{\infty} \frac{1}{n} n1∑∞?n1? 這個級數…