Python中检测文本框可输入状态?替代time.sleep方案求助
替代固定sleep的可靠方案
以下几种方案可以替代不可靠的time.sleep,精准检测记事本文本框的可输入状态:
方案1:用pyautogui等待窗口激活
利用pyautogui的窗口管理功能,循环等待目标窗口出现并激活,避免固定等待时间的不确定性:
import pyautogui import subprocess as sp programName = "notepad.exe" fileName = "Virus.txt" proc = sp.Popen([programName, fileName]) # 循环等待记事本窗口加载完成 notepad_window = None while not notepad_window: # 按文件名匹配记事本窗口标题 matched_windows = pyautogui.getWindowsWithTitle(fileName) if matched_windows: notepad_window = matched_windows[0] # 激活窗口并确保焦点到位 notepad_window.activate() while pyautogui.getActiveWindow() != notepad_window: pass # 文本框已处于可输入状态,执行输入 pyautogui.typewrite("this is a virus try to escape(:", interval=0.1)
方案2:通过Windows API精准检测文本框状态
借助pywin32库直接定位记事本的文本框控件,判断其是否可编辑且获得焦点,可靠性更高。先安装依赖:pip install pywin32
import subprocess as sp import pyautogui import win32gui import win32api import win32con def get_notepad_edit_hwnd(main_hwnd): # 递归查找记事本内的Edit控件 edit_hwnds = [] def enum_child_callback(child_hwnd, extra): if win32gui.GetClassName(child_hwnd) == "Edit": extra.append(child_hwnd) win32gui.EnumChildWindows(main_hwnd, enum_child_callback, edit_hwnds) return edit_hwnds[0] if edit_hwnds else None programName = "notepad.exe" fileName = "Virus.txt" proc = sp.Popen([programName, fileName]) # 等待记事本主窗口出现 main_hwnd = None while not main_hwnd: main_hwnd = win32gui.FindWindow("Notepad", fileName) # 等待文本框控件加载 edit_hwnd = None while not edit_hwnd: edit_hwnd = get_notepad_edit_hwnd(main_hwnd) def is_edit_ready(edit_hwnd): # 检查文本框是否非只读且获得焦点 window_style = win32gui.GetWindowLong(edit_hwnd, win32con.GWL_STYLE) is_readonly = (window_style & win32con.ES_READONLY) != 0 has_focus = win32gui.GetFocus() == edit_hwnd return not is_readonly and has_focus # 等待文本框进入可输入状态 while not is_edit_ready(edit_hwnd): win32gui.SetForegroundWindow(main_hwnd) win32api.SendMessage(edit_hwnd, win32con.WM_SETFOCUS, 0, 0) pyautogui.typewrite("this is a virus try to escape(:", interval=0.1)
方案3:进程等待+窗口检测结合
先等待进程初始化,再循环检测窗口,平衡效率与可靠性:
import subprocess as sp import pyautogui import time programName = "notepad.exe" fileName = "Virus.txt" proc = sp.Popen([programName, fileName]) # 给进程短时间初始化时间 time.sleep(0.5) # 循环等待窗口并激活 notepad_window = None while not notepad_window: matched_windows = pyautogui.getWindowsWithTitle(fileName) if matched_windows: notepad_window = matched_windows[0] notepad_window.activate() # 确保焦点稳定在窗口 while pyautogui.getActiveWindow() != notepad_window: notepad_window.activate() time.sleep(0.1) pyautogui.typewrite("this is a virus try to escape(:", interval=0.1)
内容的提问来源于stack exchange,提问作者BlueNerf
相关产品推荐
相关产品推荐

