python庫 Pywin32使用


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")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM