创建全局热键:不切换窗口自动输入文本文件内容的问题
全局热键触发无焦点模拟输入解决方案
问题分析
当前通过批处理/快捷方式触发脚本时,会因控制台窗口抢夺焦点导致输入失效,且之前的热键监听方案存在高CPU占用问题。核心需求是事件驱动的轻量全局热键+直接向当前活动窗口发送输入,完全不切换焦点。
优化后的Python脚本
先安装依赖:
pip install keyboard pywin32
脚本代码:
import keyboard import win32gui import win32api import win32con import time def read_command_text(): try: with open("commandText.txt", "r", encoding="utf-8") as f: return f.read() except FileNotFoundError: return "" def send_text_to_window(hwnd, text): # 逐字符向目标窗口发送按键消息 for char in text: win32api.SendMessage(hwnd, win32con.WM_CHAR, ord(char), 0) time.sleep(0.01) # 模拟正常输入间隔,避免应用处理过载 def on_hotkey_triggered(): # 获取当前处于焦点的窗口句柄 active_window = win32gui.GetForegroundWindow() input_text = read_command_text() if input_text and active_window: send_text_to_window(active_window, input_text) # 注册全局热键(示例为Ctrl+Shift+X,可自行修改) keyboard.add_hotkey('ctrl+shift+x', on_hotkey_triggered) # 事件驱动等待,CPU占用极低 keyboard.wait()
关键改进点
- 轻量热键监听:用
keyboard.add_hotkey实现事件驱动的全局热键,无需轮询,CPU占用几乎可以忽略 - 无焦点输入:通过Windows API直接向当前活动窗口发送字符消息,完全不切换焦点,也不会弹出控制台窗口
- 安全文件处理:用
with语句自动管理文件句柄,避免资源泄漏
避免控制台窗口的方法
如果直接运行.py脚本会弹出控制台(抢夺焦点),可以用以下两种方式解决:
- 改用Pythonw运行:把脚本后缀改为
.pyw,创建快捷方式指向pythonw.exe your_script.pyw,运行时无控制台窗口 - 打包成无控制台EXE:用PyInstaller打包:
打包后的EXE运行时完全无界面,不会干扰任何窗口焦点pyinstaller --onefile --windowed your_script.py
注意事项
- 热键可自行修改,避免与其他软件的快捷键冲突
- 若目标应用无法接收
WM_CHAR消息,可尝试替换为发送WM_KEYDOWN+WM_KEYUP消息(需调整send_text_to_window函数) - 部分系统级应用或游戏可能需要管理员权限运行脚本,若输入失效,右键以管理员身份启动即可
内容的提问来源于stack exchange,提问作者Tamber Squirrel
相关产品推荐
相关产品推荐

