如何在后台/非活动窗口运行自动化脚本?Pywinauto窗口前置问题求助
解决Pywinauto后台运行不前置窗口及鼠标检测问题
一、实现后台无前置窗口操作
你的代码中window.type_keys()会默认激活目标窗口,导致窗口前置。要实现后台操作,需直接与窗口控件交互,避免触发窗口激活。以下是修改后的代码:
from pywinauto.application import Application import time import win32api import win32con # 连接到记事本进程 app = Application().connect(path='notepad.exe') window = app.window(title='Untitled - Notepad') # 获取记事本的编辑控件(默认类名为Edit) edit_ctrl = window.Edit # 等待5秒,方便切换到其他窗口测试 time.sleep(5) # 方法1:直接设置文本(完全后台,不激活窗口) edit_ctrl.set_text("后台输入的文本") # 方法2:发送按键消息(模拟逐字符输入,不激活窗口) for char in "逐个输入的字符": win32api.SendMessage(edit_ctrl.handle, win32con.WM_CHAR, ord(char), 0) time.sleep(0.1)
关键说明:
- 直接操作窗口的
Edit控件而非整个窗口,避免触发窗口激活逻辑 - 使用
set_text()或Windows API发送WM_CHAR消息,均不会将目标窗口前置
二、实现鼠标检测功能
1. 获取实时鼠标位置
通过win32api直接读取鼠标坐标:
import win32api import time while True: x, y = win32api.GetCursorPos() print(f"当前鼠标位置:X={x}, Y={y}") time.sleep(0.5)
2. 监听鼠标点击事件
用ctypes调用Windows钩子函数,监听左右键点击动作:
import ctypes import ctypes.wintypes import win32con user32 = ctypes.WinDLL('user32', use_last_error=True) WH_MOUSE_LL = 14 # 定义钩子回调函数类型 HOOKPROC = ctypes.CFUNCTYPE(ctypes.wintypes.LRESULT, ctypes.wintypes.WPARAM, ctypes.wintypes.LPARAM, ctypes.POINTER(ctypes.wintypes.LPARAM)) # 鼠标钩子结构体 class MSLLHOOKSTRUCT(ctypes.Structure): _fields_ = [ ('pt', ctypes.wintypes.POINT), ('mouseData', ctypes.wintypes.DWORD), ('flags', ctypes.wintypes.DWORD), ('time', ctypes.wintypes.DWORD), ('dwExtraInfo', ctypes.wintypes.LPARAM), ] def mouse_hook(nCode, wParam, lParam): if nCode >= 0: hook_data = ctypes.cast(lParam, ctypes.POINTER(MSLLHOOKSTRUCT)).contents if wParam == win32con.WM_LBUTTONDOWN: print(f"左键点击:X={hook_data.pt.x}, Y={hook_data.pt.y}") elif wParam == win32con.WM_RBUTTONDOWN: print(f"右键点击:X={hook_data.pt.x}, Y={hook_data.pt.y}") return user32.CallNextHookEx(None, nCode, wParam, lParam) # 注册钩子 hook_func = HOOKPROC(mouse_hook) user32.SetWindowsHookExW(WH_MOUSE_LL, hook_func, user32.GetModuleHandleW(None), 0) # 保持脚本运行以监听事件 msg = ctypes.wintypes.MSG() while user32.GetMessageW(ctypes.byref(msg), None, 0, 0) != 0: user32.TranslateMessage(ctypes.byref(msg)) user32.DispatchMessageW(ctypes.byref(msg))
三、整合后台操作与鼠标检测
如果需要结合两者(比如鼠标点击特定位置时执行后台输入),可将逻辑合并:
from pywinauto.application import Application import time import win32api import win32con import ctypes import ctypes.wintypes # 初始化记事本连接 app = Application().connect(path='notepad.exe') window = app.window(title='Untitled - Notepad') edit_ctrl = window.Edit # 鼠标钩子设置 user32 = ctypes.WinDLL('user32', use_last_error=True) WH_MOUSE_LL = 14 HOOKPROC = ctypes.CFUNCTYPE(ctypes.wintypes.LRESULT, ctypes.wintypes.WPARAM, ctypes.wintypes.LPARAM, ctypes.POINTER(ctypes.wintypes.LPARAM)) class MSLLHOOKSTRUCT(ctypes.Structure): _fields_ = [('pt', ctypes.wintypes.POINT), ('mouseData', ctypes.wintypes.DWORD), ('flags', ctypes.wintypes.DWORD), ('time', ctypes.wintypes.DWORD), ('dwExtraInfo', ctypes.wintypes.LPARAM)] def mouse_hook(nCode, wParam, lParam): if nCode >= 0: hook_data = ctypes.cast(lParam, ctypes.POINTER(MSLLHOOKSTRUCT)).contents # 当左键点击坐标(100,100)附近时执行后台输入 if wParam == win32con.WM_LBUTTONDOWN and abs(hook_data.pt.x - 100) < 10 and abs(hook_data.pt.y - 100) < 10: edit_ctrl.set_text("检测到鼠标点击,后台输入文本") return user32.CallNextHookEx(None, nCode, wParam, lParam) hook_func = HOOKPROC(mouse_hook) user32.SetWindowsHookExW(WH_MOUSE_LL, hook_func, user32.GetModuleHandleW(None), 0) # 运行监听循环 msg = ctypes.wintypes.MSG() while user32.GetMessageW(ctypes.byref(msg), None, 0, 0) != 0: user32.TranslateMessage(ctypes.byref(msg)) user32.DispatchMessageW(ctypes.byref(msg))
内容的提问来源于stack exchange,提问作者Hannoudi
相关产品推荐
相关产品推荐

