python如何根据windows窗口名称、进程pid打开窗口(pygetwindow)

Written by

in

文章目录
  • 简介 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)
  • 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
  • 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: Python实现Windows环境下自动备份文件到远程目录 PyInstaller将Python打包成windows可执行的exe(细致版) Python Flask实现多文件项目打包部署(Linux+Docker+Windows全环境)指南 Windows系统上管理多个Python环境并实现灵活切换的完整指南 windows系统下Boost.Python的配置和使用方法(新手教学) 把Python应用打包成Windows可执行程序(.exe)的完整指南 windows python安装mathutils库出现错误的解决过程
  • 目录
    • pygetwindow详解
    • 根据程序名查pid
    • 根据窗口名结束程序
    • 根据窗口名称打开窗口
    • 根据进程pid打开窗口
      • 方法一
      • 方法二
    • 总结

      简介

      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)
      

      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
      

      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系统下使用,并且需要使用管理员权限运行程序。

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

      您可能感兴趣的文章:

      • Python实现Windows环境下自动备份文件到远程目录
      • PyInstaller将Python打包成windows可执行的exe(细致版)
      • Python Flask实现多文件项目打包部署(Linux+Docker+Windows全环境)指南
      • Windows系统上管理多个Python环境并实现灵活切换的完整指南
      • windows系统下Boost.Python的配置和使用方法(新手教学)
      • 把Python应用打包成Windows可执行程序(.exe)的完整指南
      • windows python安装mathutils库出现错误的解决过程

      站内搜索