两份代码,自己组合下就能形成花式截图。
# 截图整个桌面
import win32gui
import win32ui
import win32con
import win32api
# 获取桌面
hdesktop = win32gui.GetDesktopWindow()
# 分辨率适应
width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
# 参数定义:
# SM_CXSCREEN = 0 'X Size of screen
# SM_CYSCREEN = 1 'Y Size of Screen
# SM_CXVSCROLL = 2 'X Size of arrow in vertical scroll bar.
# SM_CYHSCROLL = 3 'Y Size of arrow in horizontal scroll bar
# SM_CYCAPTION = 4 'Height of windows caption
# SM_CXBORDER = 5 'Width of no-sizable borders
# SM_CYBORDER = 6 'Height of non-sizable borders
# SM_CXDLGFRAME = 7 'Width of dialog box borders
# SM_CYDLGFRAME = 8 'Height of dialog box borders
# SM_CYHTHUMB = 9 'Height of scroll box on horizontal scroll bar
# SM_CXHTHUMB = 10 ' Width of scroll box on horizontal scroll bar
# SM_CXICON = 11 'Width of standard icon
# SM_CYICON = 12 'Height of standard icon
# SM_CXCURSOR = 13 'Width of standard cursor
# SM_CYCURSOR = 14 'Height of standard cursor
# SM_CYMENU = 15 'Height of menu
# SM_CXFULLSCREEN = 16 'Width of client area of maximized window
# SM_CYFULLSCREEN = 17 'Height of client area of maximized window
# SM_CYKANJIWINDOW = 18 'Height of Kanji window
# SM_MOUSEPRESENT = 19 'True is a mouse is present
# SM_CYVSCROLL = 20 'Height of arrow in vertical scroll bar
# SM_CXHSCROLL = 21 'Width of arrow in vertical scroll bar
# SM_DEBUG = 22 'True if deugging version of windows is running
# SM_SWAPBUTTON = 23 'True if left and right buttons are swapped.
# SM_CXMIN = 28 'Minimum width of window
# SM_CYMIN = 29 'Minimum height of window
# SM_CXSIZE = 30 'Width of title bar bitmaps
# SM_CYSIZE = 31 'height of title bar bitmaps
# SM_CXMINTRACK = 34 'Minimum tracking width of window
# SM_CYMINTRACK = 35 'Minimum tracking height of window
# SM_CXDOUBLECLK = 36 'double click width
# SM_CYDOUBLECLK = 37 'double click height
# SM_CXICONSPACING = 38 'width between desktop icons
# SM_CYICONSPACING = 39 'height between desktop icons
# SM_MENUDROPALIGNMENT = 40 'Zero if popup menus are aligned to the left of the memu bar item. True if it is aligned to the right.
# SM_PENWINDOWS = 41 'The handle of the pen windows DLL if loaded.
# SM_DBCSENABLED = 42 'True if double byte characteds are enabled
# SM_CMOUSEBUTTONS = 43 'Number of mouse buttons.
# SM_CMETRICS = 44 'Number of system metrics
# SM_CLEANBOOT = 67 'Windows 95 boot mode. 0 = normal, 1 = safe, 2 = safe with network
# SM_CXMAXIMIZED = 61 'default width of win95 maximised window
# SM_CXMAXTRACK = 59 'maximum width when resizing win95 windows
# SM_CXMENUCHECK = 71 'width of menu checkmark bitmap
# SM_CXMENUSIZE = 54 'width of button on menu bar
# SM_CXMINIMIZED = 57 'width of rectangle into which minimised windows must fit.
# SM_CYMAXIMIZED = 62 'default height of win95 maximised window
# SM_CYMAXTRACK = 60 'maximum width when resizing win95 windows
# SM_CYMENUCHECK = 72 'height of menu checkmark bitmap
# SM_CYMENUSIZE = 55 'height of button on menu bar
# SM_CYMINIMIZED = 58 'height of rectangle into which minimised windows must fit.
# SM_CYSMCAPTION = 51 'height of windows 95 small caption
# SM_MIDEASTENABLED = 74 'Hebrw and Arabic enabled for windows 95
# SM_NETWORK = 63 'bit o is set if a network is present.
# SM_SECURE = 44 'True if security is present on windows 95 system
# SM_SLOWMACHINE = 73 'true if machine is too slow to run win95.
# 创建设备描述表
desktop_dc = win32gui.GetWindowDC(hdesktop)
img_dc = win32ui.CreateDCFromHandle(desktop_dc)
# 创建一个内存设备描述表
mem_dc = img_dc.CreateCompatibleDC()
# 创建位图对象
screenshot = win32ui.CreateBitmap()
screenshot.CreateCompatibleBitmap(img_dc, width, height)
mem_dc.SelectObject(screenshot)
# 截图至内存设备描述表
mem_dc.BitBlt((0, 0), (width, height), img_dc, (left, top), win32con.SRCCOPY)
# 将截图保存到文件中
screenshot.SaveBitmapFile(mem_dc, 'screenshot.bmp')
# 内存释放
mem_dc.DeleteDC()
win32gui.DeleteObject(screenshot.GetHandle())
# 对后台应用程序截图,程序窗口可以被覆盖,但如果最小化后只能截取到标题栏、菜单栏等。
import win32gui
import win32ui
import win32con
from ctypes import windll
from PIL import Image
# 获取要截取窗口的句柄
hwnd = win32gui.FindWindow("Afx:01370000:8:00010003:00000000:00200757", None)
# 获取句柄窗口的大小信息
# 可以通过修改该位置实现自定义大小截图
left, top, right, bot = win32gui.GetWindowRect(hwnd)
w = right - left
h = bot - top
# 返回句柄窗口的设备环境、覆盖整个窗口,包括非客户区,标题栏,菜单,边框
hwndDC = win32gui.GetWindowDC(hwnd)
# 创建设备描述表
mfcDC = win32ui.CreateDCFromHandle(hwndDC)
# 创建内存设备描述表
saveDC = mfcDC.CreateCompatibleDC()
# 创建位图对象
saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
saveDC.SelectObject(saveBitMap)
# 截图至内存设备描述表
img_dc = mfcDC
mem_dc = saveDC
mem_dc.BitBlt((0, 0), (w, h), img_dc, (100, 100), win32con.SRCCOPY)
# 将截图保存到文件中
saveBitMap.SaveBitmapFile(mem_dc, 'screenshot.bmp')
# 改变下行决定是否截图整个窗口,可以自己测试下
# result = windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 1)
result = windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 0)
print(result)
# 获取位图信息
bmpinfo = saveBitMap.GetInfo()
bmpstr = saveBitMap.GetBitmapBits(True)
# 生成图像
im = Image.frombuffer(
'RGB',
(bmpinfo['bmWidth'], bmpinfo['bmHeight']),
bmpstr, 'raw', 'BGRX', 0, 1)
# 内存释放
win32gui.DeleteObject(saveBitMap.GetHandle())
saveDC.DeleteDC()
mfcDC.DeleteDC()
win32gui.ReleaseDC(hwnd, hwndDC)
# 存储截图
if result == 1:
#PrintWindow Succeeded
im.save("test.png")
im.show()
# PIL简单实现截图,只能截图最上层窗口
from PIL import Image,ImageGrab
bbox = (1085, 102, 1368, 373)
img = ImageGrab.grab(bbox)
# img = ImageGrab.grab()
img.save("pixel.png")
img.show()
# 图像存储:应用cv2
signedIntsArray = saveBitMap.GetBitmapBits(True)
img = np.fromstring(signedIntsArray, dtype='uint8')
img.shape = (height,width,4)
cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)
# 图像存储应用numpy
bmInfo = saveBitMap.GetInfo()
im = np.frombuffer(saveBitMap.GetBitmapBits(True), dtype = np.uint8)
im.reshape(bmInfo['bmHeight'], bmInfo['bmWidth'], 4)[:, :, -2::-1]