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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:45:33