python如何根據(jù)windows窗口名稱、進程pid打開窗口(pygetwindow)
pygetwindow詳解
簡介
pygetwindow是一個Python庫,用于獲取、操作和管理當(dāng)前打開的窗口。
它提供了一些常用的窗口操作方法,包括獲取窗口句柄,獲取窗口位置和大小,移動和調(diào)整窗口大小,最小化、最大化和還原窗口,以及模擬輸入和焦點控制等。
安裝
pip install pygetwindow==0.0.9
詳解
獲取當(dāng)前所有窗口
import pygetwindow as gw # 獲取當(dāng)前所有窗口 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)
移動和調(diào)整窗口大小
import pygetwindow as gw # 移動和調(diào)整窗口大小 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()方法根據(jù)類名或者窗口標題查找頂層窗口,也可以使用getWindows()方法獲取所有窗口并遍歷查找特定窗口。
import pygetwindow as gw
根據(jù)窗口標題查找頂層窗口
window = gw.findTopWindow(title='My Window')
遍歷所有窗口查找特定窗口
for window in gw.getWindows(): if 'My Window' in window.title: print(window.title)
發(fā)送鍵盤、鼠標事件
可以使用keydown()、keyup()方法發(fā)送按鍵事件,使用click()方法發(fā)送鼠標單擊事件,使用dragTo()方法發(fā)送鼠標拖動事件。
# 根據(jù)窗口標題獲取窗口對象
window = gw.getWindowsWithTitle('My Window')[0]
# 發(fā)送按鍵事件
window.keyDown('ctrl')
window.keyDown('alt')
window.keyUp('ctrl')
window.keyUp('alt')
# 發(fā)送鼠標單擊事件
window.click()
# 發(fā)送鼠標拖動事件
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)
根據(jù)程序名查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}'")
根據(jù)窗口名結(jié)束程序
class Monitor(object):
'''監(jiān)控錄屏程序'''
@classmethod
def kill_process_by_pid(cls, pid, title):
'''根據(jù)pid結(jié)束進程'''
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)
根據(jù)窗口名稱打開窗口
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
根據(jù)進程pid打開窗口
方法一
import win32gui
import win32process
pid = 1234 # 替換成你要打開的進程的PID
# 獲取指定進程的主窗口句柄
hwnd = win32gui.FindWindow(None, f"PID:{pid}")
# 獲取該進程的線程ID和進程ID
tid, procid = win32process.GetWindowThreadProcessId(hwnd)
# 將該窗口設(shè)為前臺窗口(激活窗口)
win32gui.SetForegroundWindow(hwnd)
需要注意的是,此方法僅適用于Windows系統(tǒng),同樣需要使用管理員權(quán)限運行程序。另外,如果該進程擁有多個窗口,則可能需要在FindWindow()方法中指定更準確的窗口標題或類名等參數(shù),以確保找到正確的窗口。
方法二
import pygetwindow
pid = 1234 # 替換成你要打開的進程的PID
# 找到指定PID的窗口
window = pygetwindow.getWindowsWithTitle(f"PID: {pid}")[0]
# 激活窗口
window.activate()
其中getWindowsWithTitle()方法的參數(shù)可以是窗口的標題、進程ID等。
上述示例中,我們通過"PID: {pid}"來找到指定進程的窗口。如果找到了多個符合條件的窗口,可以通過下標來選擇需要操作的窗口。
需要注意的是,這種方法只能在Windows系統(tǒng)下使用,并且需要使用管理員權(quán)限運行程序。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Python實現(xiàn)Windows環(huán)境下自動備份文件到遠程目錄
- PyInstaller將Python打包成windows可執(zhí)行的exe(細致版)
- Python Flask實現(xiàn)多文件項目打包部署(Linux+Docker+Windows全環(huán)境)指南
- Windows系統(tǒng)上管理多個Python環(huán)境并實現(xiàn)靈活切換的完整指南
- windows系統(tǒng)下Boost.Python的配置和使用方法(新手教學(xué))
- 把Python應(yīng)用打包成Windows可執(zhí)行程序(.exe)的完整指南
- windows python安裝mathutils庫出現(xiàn)錯誤的解決過程
相關(guān)文章
python中的try except與R語言中的tryCatch異常解決
這篇文章主要為大家介紹了python中的try except與R語言中的tryCatch異常解決的方式及分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
深度學(xué)習(xí)入門之Pytorch 數(shù)據(jù)增強的實現(xiàn)
這篇文章主要介紹了深度學(xué)習(xí)入門之Pytorch 數(shù)據(jù)增強的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Pycharm+Python工程,引用子模塊的實現(xiàn)
這篇文章主要介紹了Pycharm+Python工程,引用子模塊的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
python中with語句結(jié)合上下文管理器操作詳解
這篇文章主要給大家介紹了關(guān)于python中with語句結(jié)合上下文管理器操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
python環(huán)境搭建Makefile簡單使用步驟
Makefile是一種自動化構(gòu)建工具,通過定義規(guī)則、依賴關(guān)系和執(zhí)行命令,替代手動重復(fù)敲編譯、運行和清理等指令,提升開發(fā)效率,本文給大家介紹python環(huán)境搭建Makefile簡單使用方法,感興趣的朋友跟隨小編一起看看吧2026-02-02
Scrapy將數(shù)據(jù)保存到Excel和MySQL中的方法實現(xiàn)
本文主要介紹了Scrapy將數(shù)據(jù)保存到Excel和MySQL中的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02

