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

这篇具有很好参考价值的文章主要介绍了python --根据windows窗口名称、进程pid打开窗口(pygetwindow详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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系统下使用,并且需要使用管理员权限运行程序。文章来源地址https://www.toymoban.com/news/detail-466125.html

到了这里,关于python --根据windows窗口名称、进程pid打开窗口(pygetwindow详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 打开Windows文件窗口

    Github:ookii-dialogs-winforms,下载后缀为nupkg的文件,修改后缀为rar,解压打开找到 Ookii.Dialogs.WinForms.dll Assets目录下新建css.rsp文件,文件内容为: -r:System.Windows.Forms.dll API等级调整为.NET Framework Unity版本2021.3.6f1c1

    2024年02月12日
    浏览(66)
  • 【Centos】【python】获取进程的PID

    查看进程PID的命令是 ps -ef | grep 进程名称 问题:在多进程运行时同一个进程名称的pid对应多个pid 解决:根据PPID(父类pid)有无PPID来判断是否是根pid 例如 输出

    2024年02月11日
    浏览(34)
  • Windows环境命令行CMD启动远程服务器上的bat文件,附查看远程服务器进程和按PID停止远程服务器进程命令

    Windows环境命令行CMD启动远程服务器上的bat文件,附查看远程服务器进程和按PID停止远程服务器进程命令 Windows环境命令行CMD启动远程服务器上的bat文件,命令如下: 执行后会返回启动的进程ID: 查看远程服务器进程命令: 按PID停止远程服务器进程命令:

    2024年02月07日
    浏览(71)
  • Windows 打开cmd/dos窗口的12种方式(全网最全)

    最近在写某个批处理脚本时,意外发现 Windows系统中,在不同路径打开的cmd/dos窗口,属性配置竟然不同,接下来就一起来探究下。 (以下演示在Win10系统,其他版本系统可能会有不同; cmd窗口/dos窗口/命令提示符窗口,不用纠结叫法) 今天先来总结下打开cmd/dos窗口都有哪些

    2024年02月09日
    浏览(33)
  • [ Windows 10 ] 任务栏按钮不显示正在打开的窗口了(打开任何程序任务栏图标按钮都不显示)

    系统是Windows 10 professional版本,在一次突然开机后,发现点开程序后,在任务栏什么都不显示,任务栏按钮和图标状态均不显示了,但是程序在运行。 当时兄弟们我心态直接蹦了啊,100万个草泥马根本停不下来,口里不断重复学习英文单词: what\\\'s the f**king going on? 异常情况如

    2024年02月04日
    浏览(51)
  • 论多窗口相互关联下window.open打开已在的窗口时只激活不刷新的实现方案

    前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~ 主页: oliver尹的主页 格言: 跌倒了爬起来就好~ 来个关注吧,点个赞吧,谢谢 近期,我司有个小伙伴遇到这么个场景实现起来感觉有点

    2024年02月04日
    浏览(58)
  • Java实现Windows任务栏图标闪烁功能,托盘图标闪烁,点击任务栏打开Java窗口

      JFrame 是指一个计算机语言-java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。 GUI主要功能是实现人与计算机等电子设备的人机交互。它是用户与操作系统之间进行数据传递和互动操控的工具,用户可以通过一定的操作实现对电子

    2024年01月24日
    浏览(38)
  • python 打开PDF文件并显示窗口上

    打开一个指定pdf文件,将pdf文件中第一页显示在窗口上 参考文章: Python-读取PDF文件显示在窗口上-Pdf阅读器

    2024年02月08日
    浏览(34)
  • Python 图形化界面基础篇:打开和关闭新窗口

    在 Python 图形用户界面( GUI )应用程序中,创建和管理多个窗口是一项重要的任务。这些窗口可以用于不同的用途,例如显示附加信息、执行特定操作或以其他方式改善用户体验。在本文中,我们将深入研究如何使用 Python 的 Tkinter 库来打开和关闭新窗口,并演示如何在应用

    2024年02月04日
    浏览(51)
  • iframe/window.open/a三种标签打开新页面或新窗口设置请求头;实现免密登录

    对于前端来说,一般在登录获取token之后会把token存入缓存以及放置在Request Headers请求头中,但是使用iframe/window.open/a这三种标签打开新页面或新窗口是没有办法把请求头带过去的,这个时候就需要自己设置请求头,有如下有两种办法: 方法一(不推荐): 第一种方法可以说是最

    2024年02月12日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包