任务计划程序运行pywinauto脚本触发Webex键盘输入RuntimeError
解决Windows任务计划定时运行pywinauto脚本的SendInput错误
问题根源
定时触发任务计划时,脚本大概率跑在无交互的后台会话里。type_keys依赖的SendInput API需要当前会话有活跃的桌面交互环境,还得让目标窗口拿到焦点。手动点运行或立即执行任务时,会话处于活跃状态,满足条件所以正常;定时运行时没这个环境,就触发了键盘事件插入失败的错误。
可行解决方案
1. 调整任务计划的交互权限配置
- 打开任务计划程序,找到你的任务右键选「属性」
- 「常规」选项卡:勾选「不管用户是否登录都要运行」,同时必须勾选「使用最高权限运行」
- 「设置」选项卡:勾选「允许任务在按需运行时唤醒计算机」(如果定时时间电脑可能休眠的话)
- 「条件」选项卡:取消勾选「只有在计算机使用交流电源时才启动此任务」(避免电源状态限制脚本运行)
2. 切换pywinauto的输入模式
放弃依赖桌面焦点的SendInput,改用后台输入方式:
from pywinauto.application import Application # 用uia后端初始化应用,支持后台输入 app = Application(backend="uia").connect(title="Webex窗口标题") main_dlg = app.window(title="Webex窗口标题") # 用send_keys替代type_keys,无需窗口焦点也能输入 main_dlg.send_keys("要发送的消息内容", with_spaces=True, with_newlines=True)
也可以直接用win32api模拟键盘输入(需先确保窗口激活):
import win32api import win32con # 获取Webex窗口句柄(假设已通过pywinauto拿到main_dlg) hwnd = main_dlg.handle # 先激活窗口 win32api.SetForegroundWindow(hwnd) # 逐字符模拟输入 for char in "测试消息": win32api.keybd_event(ord(char), 0, 0, 0) win32api.keybd_event(ord(char), 0, win32con.KEYEVENTF_KEYUP, 0)
3. 确保脚本运行时目标窗口可用
- 脚本开头加延迟,给Webex足够的加载时间:
import time time.sleep(5) # 可根据实际启动速度调整时长
- 增加窗口存在性检查,避免找不到窗口的情况:
if not main_dlg.exists(): # 窗口不存在时重启Webex import subprocess subprocess.Popen("C:\\实际路径\\Webex.exe") time.sleep(10) app = Application(backend="uia").connect(title="Webex窗口标题") main_dlg = app.window(title="Webex窗口标题")
4. 修正批处理的日志路径(可选)
把日志文件改成绝对路径,防止定时运行时找不到输出位置:
set LOGFILE=C:\automation\dash_check_log.txt "C:\Users\AppData\Local\Programs\Python\Python312-32\python.exe" "C:\automation\dash_check_v1.py" > %LOGFILE% 2>&1
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

