python - 如何截取特定窗口的屏幕截图?(Python)
问题描述
所以,我想截取带有特殊标题的特定窗口的屏幕截图
我试过这段代码:
import pyautogui
import win32gui
def screenshot(window_title=None):
if window_title:
hwnd = win32gui.FindWindow(None, window_title)
if hwnd:
win32gui.SetForegroundWindow(hwnd)
x, y, x1, y1 = win32gui.GetClientRect(hwnd)
x, y = win32gui.ClientToScreen(hwnd, (x, y))
x1, y1 = win32gui.ClientToScreen(hwnd, (x1 - x, y1 - y))
im = pyautogui.screenshot(region=(x, y, x1, y1))
return im
else:
print('Window not found!')
else:
im = pyautogui.screenshot()
return im
if (im := screenshot('Calculator')):
im.show()
是的,这是可行的,但是如何在不将其置于前台的情况下获取窗口的屏幕截图?
解决方案
from tkinter import *
import win32gui
import win32ui
from ctypes import windll
def screenshot():
hwnd = win32gui.FindWindow(None, 'Calculator') #'Calculator' = program name
#left, top, right, bot = win32gui.GetClientRect(hwnd)
left, top, right, bot = win32gui.GetWindowRect(hwnd)
w = right - left #wide
h = bot - top #hight
hwndDC = win32gui.GetWindowDC(hwnd)
mfcDC = win32ui.CreateDCFromHandle(hwndDC)
saveDC = mfcDC.CreateCompatibleDC()
saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
saveDC.SelectObject(saveBitMap)
#result = windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 0)
result = windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 1)
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: #if Succeeded
im.save("C:/Users/Moon/Desktop/test.png") # save path
else:
print("Error")
screenshot()
我放了一个计算器。改变路径并尝试
推荐阅读
- javascript - 如何显示年份的最后一个月?
- javafx-webview - JavaFX 网页视图
- mysql - CONCAT FLOOR 语句的使用-SOLVED
- .net - dotnet 如何从包中选择要使用的 dll
- javascript - 在参考滚动视图上反应本机错误,但工作
- symfony - 找不到 Nelmio 4 安全定义索引
- python - 如何让 Python 进程使用所有 Docker 容器内存而不被杀死?
- reactjs - 如何在本机反应中在顶部标签栏周围留出空间?
- c - 使用 peprocessor 宏生成函数调用
- angular - 服务器渲染部分 DOM 并将其注入 Angular 应用程序