Python 指令碼自動視窗截圖

pythondict發表於2020-05-15

利用Python自帶的win32api和win32con、win32gui等模組,我們能執行許多windows下的自動化操作。比如兩個視窗的自動點選操作,從軟體中的視窗複製文字到txt中,甚至是截圖操作。

今天Python實用寶典就來講講怎麼在Python中實現截圖功能,以下教程預設您已經安裝好了Python哦,沒有的話見這個教程:python詳細安裝指南

1.獲取視窗左上角及右下角座標

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)

結果:

F:\push\20190929>python 1.py** (349, 83, 1549, 1013)

其中視窗資訊(x1, y1, x2, y2),(x1, y1)是視窗左上角的座標,(x2, y2)是視窗右下角的座標。我們可以利用這個資訊配合PIL進行截圖。但是在這之前,我們還要解決兩個問題:

  1. 該視窗並不在當前的介面上,被其他的軟體覆蓋到底層中,這時候需要高亮視窗
  2. 該視窗被最小化怎麼辦

2.win32gui 高亮視窗

為了使得被疊在底層的視窗能放到最上層顯示,我們需要拿到視窗的handle,對其執行高亮操作,其實很簡單,我們剛剛獲得座標資訊的時候已經得到handle了,只需要做一下簡單的更改即可。

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)

這樣就能將被覆蓋到底層的視窗放到最上層,如下圖所示。

python 高亮視窗

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)
# 設為高亮 

效果如圖所示:

python還原最小化視窗

4.截圖

有了PIL模組和視窗的座標後,我們想截圖可非常簡單。PIL 模組安裝
pip install pillow

安裝完就可以試一下我們的完整程式碼了,如下:

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()
# 展示 

效果如下:

python 截圖

我們的文章到此就結束啦,如果你希望我們今天的Python 教程,請持續關注我們,如果對你有幫助,麻煩在下面點一個贊/在看哦有任何問題都可以在下方留言區留言,我們都會耐心解答的!


​Python實用寶典 (pythondict.com)
不只是一個寶典
歡迎關注公眾號:Python實用寶典
原文來自Python實用寶典:Python 截圖

Python實用寶典

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Python實用寶典, pythondict.com

相關文章