使用 pywin32
和 win32gui
进行窗口捕获时,如果你遇到黑屏问题,可能是由于以下几个原因:
以下是一个示例代码,展示了如何使用 pywin32
和 PIL
(Pillow)进行窗口捕获,并处理一些常见问题:
import win32gui
import win32ui
import win32con
import win32api
from PIL import Image
def capture_window(hwnd):
# 获取窗口的设备上下文
left, top, right, bottom = win32gui.GetWindowRect(hwnd)
width = right - left
height = bottom - top
hwndDC = win32gui.GetWindowDC(hwnd)
mfcDC = win32ui.CreateDCFromHandle(hwndDC)
saveDC = mfcDC.CreateCompatibleDC()
# 创建一个位图对象
saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC, width, height)
saveDC.SelectObject(saveBitMap)
# 捕获窗口内容
result = win32gui.PrintWindow(hwnd, saveDC.GetSafeHdc(), 1)
# 检查捕获结果
if result != 1:
print("Failed to capture window")
return None
# 将位图转换为图像
bmpinfo = saveBitMap.GetInfo()
bmpstr = saveBitMap.GetBitmapBits(True)
img = Image.frombuffer(
'RGB',
(bmpinfo['bmWidth'], bmpinfo['bmHeight']),
bmpstr, 'raw', 'BGRX', 0, 1
)
# 释放设备上下文
win32gui.DeleteObject(saveBitMap.GetHandle())
saveDC.DeleteDC()
mfcDC.DeleteDC()
win32gui.ReleaseDC(hwnd, hwndDC)
return img
def main():
# 获取目标窗口的句柄
hwnd = win32gui.FindWindow(None, 'Untitled - Notepad') # 替换为目标窗口的标题
if hwnd:
img = capture_window(hwnd)
if img:
img.show() # 显示捕获的图像
img.save('screenshot.png') # 保存捕获的图像
else:
print("Failed to capture the window.")
else:
print("Window not found.")
if __name__ == '__main__':
main()
win32gui.GetWindowDC
获取窗口的设备上下文。win32ui.CreateDCFromHandle
和 win32ui.CreateCompatibleDC
创建兼容的设备上下文,并创建一个兼容的位图对象。win32gui.PrintWindow
捕获窗口内容。如果捕获成功,PrintWindow
返回 1。PIL
(Pillow)将位图数据转换为图像对象。win32gui.FindWindow
中的窗口标题与目标窗口的标题匹配。领取专属 10元无门槛券
手把手带您无忧上云