Pywin32提供了很多訪問windows的API。較重要的三個模塊就是win32api、win32gui和win32con。
Pywin32安裝
pip install pywin32
pywin32 api文檔可參照wuxc github。
DC
DC在pywin32中是一個重要概念。windows不允許程序直接訪問硬件,所有的操作都需要通過一個設備上下文環境。屏幕上的每個窗口都對應一個DC。DC相當於一個視頻緩沖區,對這個緩沖區的操作,會表現在這個緩沖區對應的屏幕窗口上。
除了窗口對應的DC外,還可以自己創建DC,然后在創建的DC上面建立數據拷貝到窗口的DC上,就相當於刷新窗口的DC。
使用
我們使用pywin32激活窗口並對截圖。
test.py:
import win32gui,win32ui,win32con
def get_windows(windowsname,filename):
# 獲取窗口句柄
handle = win32gui.FindWindow(None,windowsname)
# 將窗口放在前台,並激活該窗口(窗口不能最小化)
win32gui.SetForegroundWindow(handle)
# 獲取窗口DC
hdDC = win32gui.GetWindowDC(handle)
# 根據句柄創建一個DC
newhdDC = win32ui.CreateDCFromHandle(hdDC)
# 創建一個兼容設備內存的DC
saveDC = newhdDC.CreateCompatibleDC()
# 創建bitmap保存圖片
saveBitmap = win32ui.CreateBitmap()
# 獲取窗口的位置信息
left, top, right, bottom = win32gui.GetWindowRect(handle)
# 窗口長寬
width = right - left
height = bottom - top
# bitmap初始化
saveBitmap.CreateCompatibleBitmap(newhdDC, width, height)
saveDC.SelectObject(saveBitmap)
saveDC.BitBlt((0, 0), (width, height), newhdDC, (0, 0), win32con.SRCCOPY)
saveBitmap.SaveBitmapFile(saveDC, filename)
get_windows("PyWin32","截圖.png")
截圖.png:

獲取句柄
一般句柄名稱都是這個窗口的title。但很多時候我們不能准確的輸入title,所以我們可以通過遍歷所有窗口的句柄,然后找到自己想要的窗口句柄。

getHandles.py:
import win32gui
hwnd_title = dict()
def get_all_hwnd(hwnd, mouse):
if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})
win32gui.EnumWindows(get_all_hwnd, 0)
for h, t in hwnd_title.items():
if t is not "":
print(h, t)

結合上一篇的pywinio我們就可以實現一些自動化的東西
打開文檔輸入helloworld並保存關閉。
import time
import win32gui,win32con
import keyboardEmulation as ke
def get_windows(windowsname,filename):
# 獲取窗口句柄
hwnd = win32gui.FindWindow(None,windowsname)
# 將窗口放在前台,並激活該窗口
win32gui.SetForegroundWindow(hwnd)
# 輸入helloworld
scancodes = [0x23, 0x12, 0x26, 0x26, 0x18, 0x11, 0x18, 0x13, 0x26, 0x20, 0x2a]
for code in scancodes:
ke.key_press(code)
# 保存
ke.key_down(0x1d)
ke.key_down(0x1f)
ke.key_up(0x1d)
ke.key_up(0x1f)
# 關閉窗口
time.sleep(1);
win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
get_windows("新建文本文檔 (2).txt - 記事本","截圖.png")

