如何让PyAutoGUI宏在指定窗口(如Chrome)后台运行?
让PyAutoGUI宏仅在指定窗口运行的解决方案
核心思路
PyAutoGUI默认模拟全局输入,会作用于当前活动窗口。要实现仅指定窗口(如Google Chrome)运行宏且不影响其他窗口操作,需做到两点:
- 精准定位目标窗口(通过标题、进程标识等)
- 直接向目标窗口发送输入事件,而非模拟全局鼠标键盘操作
具体实现(Windows系统为例)
1. 安装依赖库
需要用到窗口定位和系统API调用的库:
pip install pywin32 pygetwindow
2. 改造后的代码示例
以下代码适配你的需求,仅在Google Chrome窗口内执行宏操作,不影响其他活动窗口:
import pyautogui import random import time import mouse import win32gui import win32api import win32con from pygetwindow import getWindowsWithTitle # 定位Google Chrome窗口 def get_chrome_window(): # 匹配标题包含"Google Chrome"的窗口 chrome_windows = getWindowsWithTitle("Google Chrome") return chrome_windows[0] if chrome_windows else None # 向指定窗口发送鼠标点击(传入窗口内相对坐标) def click_in_window(hwnd, x, y): # 转换窗口相对坐标为屏幕坐标 screen_pos = win32gui.ClientToScreen(hwnd, (x, y)) # 发送鼠标按下/释放消息 win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, win32api.MAKELONG(*screen_pos)) time.sleep(0.05) win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, win32api.MAKELONG(*screen_pos)) # 向指定窗口发送键盘按键 def press_key_in_window(hwnd, key_code): win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, key_code, 0) time.sleep(0.05) win32api.SendMessage(hwnd, win32con.WM_KEYUP, key_code, 0) # -------------------------- 原代码的坐标采集部分 -------------------------- tijd = 0 actief = float(0) while not mouse.is_pressed('right'): time.sleep(0.01) bank_x1, bank_y1 = pyautogui.position() time.sleep(0.5) while not mouse.is_pressed('right'): time.sleep(0.01) bank_x2, bank_y2 = pyautogui.position() print("{} {} {} {}".format(bank_x1, bank_x2, bank_y1, bank_y2)) # -------------------------- 改造后的宏执行逻辑 -------------------------- lijst = [[bank_x1, bank_x2, bank_y1, bank_y2, 200, 243], [1203, 1236, 721, 749, 23, 49], [390, 422, 112, 140, 22, 46]] chrome_window = get_chrome_window() if not chrome_window: print("未找到Google Chrome窗口") else: hwnd = chrome_window._hWnd # 若原采集的坐标是全局屏幕坐标,需转换为窗口内相对坐标: # window_left, window_top = chrome_window.left, chrome_window.top # rel_x = x - window_left # rel_y = y - window_top while not mouse.is_pressed('middle') or actief > tijd: # 原lijst仅3个元素,修正循环范围 for i in range(0, 3): x = random.randint(lijst[i][0], lijst[i][1]) y = random.randint(lijst[i][2], lijst[i][3]) wacht = random.randint(lijst[i][4], lijst[i][5]) / 100 time.sleep(wacht) # 仅在Chrome窗口内执行点击 click_in_window(hwnd, x, y) # 向Chrome窗口发送ESC按键 press_key_in_window(hwnd, win32con.VK_ESCAPE)
关键细节说明
- 窗口定位:通过
pygetwindow匹配窗口标题,也可使用win32gui.FindWindow根据进程名或窗口类名更精准定位 - 输入隔离:使用
win32api.SendMessage直接向目标窗口发送消息,完全不会干扰其他活动窗口的操作 - 坐标转换:如果采集的坐标是全局屏幕坐标,需减去Chrome窗口左上角的屏幕坐标,转换为窗口内相对坐标后再传入点击函数
跨平台方案提示
- MacOS:使用
pyobjc库调用Quartz框架实现窗口定位和输入发送 - Linux:使用
python-xlib库操作X11窗口系统
内容的提问来源于stack exchange,提问作者Joppe
相关产品推荐
相关产品推荐

