You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在后台/非活动窗口运行自动化脚本?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:22:41