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