python BitBlt PrintWindow 对整个桌面进行截图 对后台运行应用界面进行截图

两份代码,自己组合下就能形成花式截图。

# 截图整个桌面
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]
你可以使用`pywin32`库来实现对桌面实时画面的捕获。以下是一个简单的示例代码: ```python import win32gui import win32ui import win32con import win32api def capture_screen(): # 获取桌面窗口的句柄 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) # 创建设备上下文对象 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) # 将位图对象转换为PIL图像对象 bmpinfo = screenshot.GetInfo() bmpstr = screenshot.GetBitmapBits(True) img = Image.frombuffer( 'RGB', (bmpinfo['bmWidth'], bmpinfo['bmHeight']), bmpstr, 'raw', 'BGRX', 0, 1) # 清理资源 mem_dc.DeleteDC() win32gui.DeleteObject(screenshot.GetHandle()) img_dc.DeleteDC() win32gui.ReleaseDC(hdesktop, desktop_dc) return img ``` 这段代码使用`pywin32`库中的一些函数来获取桌面窗口的句柄和尺寸,并使用位图对象进行屏幕截图。最后将截图转换为PIL图像对象,你可以根据需要进行进一步处理或保存。 请确保你已经安装了`pywin32`和`Pillow`库,可以使用以下命令进行安装: ``` pip install pywin32 pip install Pillow ``` 希望这能帮助到你!如果还有其他问题,请随时提问。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值