利用Python自帶的win32api和win32con、win32gui等模塊,我們能執行許多windows下的自動化操作,比如兩個視窗的自動點擊操作,從軟體中的視窗復制文本到txt中,甚至是截圖操作,
截圖的操作用途最為廣泛,你可以用它配合定時工具,定時檢測某個程式的運行情況;甚至可以根據截圖做一些輔助性的決策,比如玩類似于《連連看 》的 游戲時,對相同型別的方塊進行標記,輔助你玩游戲,
很多人學習蟒蛇,不知道從何學起, 很多人學習尋找python,掌握了基本語法之后,不知道在哪里的案例上手, 很多已經可能知道案例的人,卻不怎么去學習更多高深的知識, 這三類人,我給大家提供一個好的學習平臺,免費獲取視頻教程,電子書,以及課程的源代碼! QQ群:101677771 歡迎加入,一起討論學習
下面就講講如何使用 win32api 實作自動喚醒并截圖的操作,
1.準備
開始之前,你要確保Python和pip已經成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細Python安裝指南進行安裝,
(可選1) 如果你用Python的目的是資料分析,可以直接安裝Anaconda: Python資料分析與挖掘好幫手—Anaconda ,它內置了Python和pip.
(可選2) 此外,推薦大家用VSCode編輯器,它有許多的優點: Python 編程的最好搭檔—VSCode 詳細指南 ,
請選擇以下任一種方式輸入命令安裝依賴 :
1. Windows 環境 打開 Cmd (開始-運行-CMD),
2. MacOS 環境 打開 Terminal (command+空格輸入Terminal),
3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install pypiwin32
pip install pillow
2.如何獲取視窗坐標
通過 win32gui 的 FindWindow 函式,我們能輕易地找到任何行程的視窗:
import win32api, win32con, win32gui
def get_window_pos(name):
name = name
handle = win32gui.FindWindow(0, name)
# 獲取視窗句柄
if handle == 0:
return None
else:
return win32gui.GetWindowRect(handle)
x1, y1, x2, y2 = get_window_pos('暴雪戰網')
print(x1,y1,x2,y2)
結果:
>> python 1.py
# (349,83,1549,1013)
輸出結果中的元組即是視窗資訊(x1, y1, x2, y2):
(x1, y1)是視窗左上角的坐標,
(x2, y2)是視窗右下角的坐標,
我們可以利用這個資訊配合PIL進行截圖,但是在這之前,我們還要解決兩個問題:
1. 該視窗并不在當前的界面上,被其他的軟體覆寫到底層中,這時候需要高亮視窗,
2. 該視窗被最小化怎么辦?
2.win32gui 高亮視窗
為了使得被疊在底層的視窗能放到最上層顯示,我們需要拿到視窗的handle,對其執行高亮操作,
使用 win32gui 可以非常簡單地實作這個特性,我們剛付訓得坐標資訊的時候已經得到handle了,呼叫一個SetForegroundWindow方法即可:
import win32api, win32con, win32gui
def get_window_pos(name):
name = name
handle = win32gui.FindWindow(0, name)
# 獲取視窗句柄
if handle == 0:
return None
else:
# 回傳坐標值和handle
return win32gui.GetWindowRect(handle), handle
(x1, y1, x2, y2), handle = get_window_pos('暴雪戰網')
text = win32gui.SetForegroundWindow(handle)
這樣就能將被覆寫到底層的視窗放到最上層,如下圖所示,
3. 還原最小化視窗
還有一種特殊情況就是視窗被縮小了,這時候我們就需要還原最小化視窗,其實也非常簡單,只要利用win32gui和win32con向該視窗發送一個資訊即可,
import win32api, win32con, win32gui
def get_window_pos(name):
name = name
handle = win32gui.FindWindow(0, name)
# 獲取視窗句柄
if handle == 0:
return None
else:
# 回傳坐標值和handle
return win32gui.GetWindowRect(handle), handle
(x1, y1, x2, y2), handle = get_window_pos('暴雪戰網')
win32gui.SendMessage(handle, win32con.WM_SYSCOMMAND, win32con.SC_RESTORE, 0)
# 發送還原最小化視窗的資訊
win32gui.SetForegroundWindow(handle)
# 設為高亮
效果如圖所示:
4.截圖
最后可以試一下我們的完整代碼了,針對指定的坐標使用PIL模塊進行截圖,代碼如下:
import win32api, win32con, win32gui
def get_window_pos(name):
name = name
handle = win32gui.FindWindow(0, name)
# 獲取視窗句柄
if handle == 0:
return None
else:
# 回傳坐標值和handle
return win32gui.GetWindowRect(handle), handle
(x1, y1, x2, y2), handle = get_window_pos('暴雪戰網')
win32gui.SendMessage(handle, win32con.WM_SYSCOMMAND, win32con.SC_RESTORE, 0)
# 發送還原最小化視窗的資訊
win32gui.SetForegroundWindow(handle)
# 設為高亮
from PIL import Image, ImageGrab
img_ready = ImageGrab.grab((x1, y1, x2, y2))
# 截圖
img_ready.show()
# 展示
效果如下:
這個功能可好用了,比如說你需要監控一個視窗的運行狀況,不可能時時刻刻都去觀察它,你可以使用while回圈不斷呼叫這個視窗截圖腳本,先截圖進行保存,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/423635.html
標籤:其他
