2025年2月1日 星期六 甲辰(龙)年 腊月初一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

python --根据windows窗口名称、进程pid打开窗口(pygetwindow详解)

时间:08-13来源:作者:点击数:29

pygetwindow详解

简介:

pygetwindow是一个Python库,用于获取、操作和管理当前打开的窗口。它提供了一些常用的窗口操作方法,包括获取窗口句柄,获取窗口位置和大小,移动和调整窗口大小,最小化、最大化和还原窗口,以及模拟输入和焦点控制等。

安装

  • pip install pygetwindow==0.0.9

详解

获取当前所有窗口

  • import pygetwindow as gw
  • # 获取当前所有窗口
  • windows = gw.getAllWindows()
  • for window in windows:
  • print(window)

获取指定标题的窗口

  • import pygetwindow as gw
  • # 获取指定标题的窗口
  • title = "计算器"
  • window = gw.getWindowsWithTitle(title)[0]
  • print(window)

获取窗口位置和大小

  • import pygetwindow as gw
  • # 获取窗口位置和大小
  • title = "计算器"
  • window = gw.getWindowsWithTitle(title)[0]
  • print(window.left, window.top, window.width, window.height)

移动和调整窗口大小

  • import pygetwindow as gw
  • # 移动和调整窗口大小
  • title = "计算器"
  • window = gw.getWindowsWithTitle(title)[0]
  • window.moveTo(0, 0)
  • window.resizeTo(800, 600)

最小化、最大化和还原窗口

  • import pygetwindow as gw
  • # 最小化、最大化和还原窗口
  • title = "计算器"
  • window = gw.getWindowsWithTitle(title)[0]
  • # 最小化窗口
  • window.minimize()
  • # 最大化窗口
  • window.maximize()
  • # 还原窗口
  • window.restore()

模拟键盘输入和鼠标点击

  • import pygetwindow as gw
  • import time
  • # 模拟键盘输入和鼠标点击
  • title = "计算器"
  • window = gw.getWindowsWithTitle(title)[0]
  • window.activate() # 激活窗口,使得键盘输入和鼠标操作生效
  • window.type("123+456=") # 模拟键盘输入
  • time.sleep(1) # 等待1秒
  • window.mouseClick(button="left", x=50, y=50) # 模拟鼠标左键单击

查找窗口

可以使用findTopWindow()方法根据类名或者窗口标题查找顶层窗口,也可以使用getWindows()方法获取所有窗口并遍历查找特定窗口。

  • import pygetwindow as gw

根据窗口标题查找顶层窗口

  • window = gw.findTopWindow(title='My Window')

遍历所有窗口查找特定窗口

  • for window in gw.getWindows():
  • if 'My Window' in window.title:
  • print(window.title)

发送键盘、鼠标事件

可以使用keydown()keyup()方法发送按键事件,使用click()方法发送鼠标单击事件,使用dragTo()方法发送鼠标拖动事件。

  • # 根据窗口标题获取窗口对象
  • window = gw.getWindowsWithTitle('My Window')[0]
  • # 发送按键事件
  • window.keyDown('ctrl')
  • window.keyDown('alt')
  • window.keyUp('ctrl')
  • window.keyUp('alt')
  • # 发送鼠标单击事件
  • window.click()
  • # 发送鼠标拖动事件
  • window.dragTo(500, 500)

窗口置顶

  • import win32con
  • import win32gui
  • import pygetwindow as gw
  • window = gw.getWindowsWithTitle('image')[0]
  • hwnd = window._hWnd
  • win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)

根据程序名查pid

  • import psutil
  • def get_pid_by_name(process_name):
  • for proc in psutil.process_iter(['pid', 'name']):
  • print(proc.info)
  • if proc.info['name'] == process_name:
  • return proc.info['pid']
  • return None
  • # 示例使用
  • process_name = 'python.exe' # 要查找的程序名字
  • pid = get_pid_by_name(process_name)
  • if pid:
  • print(f"进程 '{process_name}' 的PID是: {pid}")
  • else:
  • print(f"找不到进程 '{process_name}'")

根据窗口名结束程序

  • class Monitor(object):
  • '''监控录屏程序'''
  • @classmethod
  • def kill_process_by_pid(cls, pid, title):
  • '''根据pid结束进程'''
  • try:
  • process = psutil.Process(pid)
  • process.terminate()
  • logger.error(f"进程 {pid};窗口名:【{title}】 已成功终止。")
  • except psutil.NoSuchProcess:
  • logger.info(f"找不到PID为 {pid};窗口名:【{title}】 的进程。")
  • @classmethod
  • def get_all_window_titles_with_pid(cls):
  • '''获取正在运行的窗口'''
  • def callback(hwnd, window_titles_with_pid):
  • if win32gui.IsWindowVisible(hwnd):
  • window_title = win32gui.GetWindowText(hwnd)
  • if window_title != '':
  • tid, pid = win32process.GetWindowThreadProcessId(hwnd)
  • window_titles_with_pid.append((window_title, pid))
  • return True
  • window_titles_with_pid = []
  • win32gui.EnumWindows(callback, window_titles_with_pid)
  • return window_titles_with_pid
  • @classmethod
  • def _start(cls):
  • pr_name = ['OBS', '格式工厂', '录屏', '剪辑', ]
  • for title, pid in cls.get_all_window_titles_with_pid():
  • logger.debug(f"窗口标题: {title}; PID: {pid}")
  • for n in pr_name:
  • if n in title:
  • cls.kill_process_by_pid(pid, title)

根据窗口名称打开窗口

  • import win32con
  • import win32gui
  • import win32print
  • def get_real_resolution():
  • """获取真实的分辨率"""
  • hdc = win32gui.GetDC(0)
  • return win32print.GetDeviceCaps(hdc, win32con.DESKTOPHORZRES), \
  • win32print.GetDeviceCaps(hdc, win32con.DESKTOPVERTRES)
  • window_hwnd: list = []
  • win32gui.EnumWindows(lambda _hwd, param: param.append(_hwd), window_hwnd)
  • status = False
  • for hwd in window_hwnd:
  • if win32gui.GetWindowText(hwd) == 'MAX BOX 3.1.5':
  • import pygetwindow
  • width, height = get_real_resolution()
  • print(f'激活窗口:{width};{height}')
  • window = pygetwindow.getWindowsWithTitle(f"MAX BOX 3.1.5")[0]
  • window.activate()
  • # win32gui.ShowWindow(hwd, win32con.SW_MAXIMIZE)
  • # win32gui.MoveWindow(hwd, (width - 1750) // 2, (height - 850) // 2, 1750, 850, True)
  • # status = True
  • break

根据进程pid打开窗口

方法一

  • import win32gui
  • import win32process
  • pid = 1234 # 替换成你要打开的进程的PID
  • # 获取指定进程的主窗口句柄
  • hwnd = win32gui.FindWindow(None, f"PID:{pid}")
  • # 获取该进程的线程ID和进程ID
  • tid, procid = win32process.GetWindowThreadProcessId(hwnd)
  • # 将该窗口设为前台窗口(激活窗口)
  • win32gui.SetForegroundWindow(hwnd)

需要注意的是,此方法仅适用于Windows系统,同样需要使用管理员权限运行程序。另外,如果该进程拥有多个窗口,则可能需要在FindWindow()方法中指定更准确的窗口标题或类名等参数,以确保找到正确的窗口。

方法二

  • import pygetwindow
  • pid = 1234 # 替换成你要打开的进程的PID
  • # 找到指定PID的窗口
  • window = pygetwindow.getWindowsWithTitle(f"PID: {pid}")[0]
  • # 激活窗口
  • window.activate()

其中getWindowsWithTitle()方法的参数可以是窗口的标题、进程ID等。上述示例中,我们通过"PID: {pid}"来找到指定进程的窗口。如果找到了多个符合条件的窗口,可以通过下标来选择需要操作的窗口。

需要注意的是,这种方法只能在Windows系统下使用,并且需要使用管理员权限运行程序。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐