Скриншот свернутого окна python

Python – снимок экрана фонового/неактивного окна

Я пытаюсь сделать быстрые скриншоты, готовые к обработке с помощью PIL/Numpy (~ 0,01 с на скриншот) с Python 3.6. В идеале окно не должно быть на переднем плане, т. е. даже когда его закрывает другое окно, снимок экрана все равно успешен.

До сих пор я изменил код для python 3 из этого вопроса: Снимок экрана Python неактивное окно PrintWindow + win32gui

Однако все, что он получает, это черные изображения.

import win32gui import win32ui from ctypes import windll from PIL import Image hwnd = win32gui.FindWindow(None, 'Calculator') # Get window bounds 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) result = windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 1) print(result) bmp_info = saveBitMap.GetInfo() bmp_str = saveBitMap.GetBitmapBits(True) print(bmp_str) im = Image.frombuffer( 'RGB', (bmp_info['bmWidth'], bmp_info['bmHeight']), bmp_str, 'raw', 'BGRX', 0, 1) win32gui.DeleteObject(saveBitMap.GetHandle()) saveDC.DeleteDC() mfcDC.DeleteDC() win32gui.ReleaseDC(hwnd, hwndDC) if result == 1: im.save("screenshot.png") 

В Windows 10 калькулятор — это приложение магазина, а не собственное приложение Win32, поэтому этот метод не будет работать. Вы должны убедиться, что целевое приложение находится на переднем плане ( SetForegroundWindow ), а затем сделать снимок экрана всего окна в определенных координатах приложения-калькулятора.

Я получаю черный снимок экрана для любого окна, а не только для калькулятора, и идея состоит в том, чтобы захватить содержимое окон, которые не находятся на переднем плане.

1 ответ

Этот код работал у меня с приложениями в фоновом режиме, а не в свернутом виде.

import win32gui import win32ui def background_screenshot(hwnd, width, height): wDC = win32gui.GetWindowDC(hwnd) dcObj=win32ui.CreateDCFromHandle(wDC) cDC=dcObj.CreateCompatibleDC() dataBitMap = win32ui.CreateBitmap() dataBitMap.CreateCompatibleBitmap(dcObj, width, height) cDC.SelectObject(dataBitMap) cDC.BitBlt((0,0),(width, height) , dcObj, (0,0), win32con.SRCCOPY) dataBitMap.SaveBitmapFile(cDC, 'screenshot.bmp') dcObj.DeleteDC() cDC.DeleteDC() win32gui.ReleaseDC(hwnd, wDC) win32gui.DeleteObject(dataBitMap.GetHandle()) hwnd = win32gui.FindWindow(None, windowname) background_screenshot(hwnd, 1280, 780) 

Источник

Читайте также:  Bayesian networks in python

MacOS: скриншот свернутого окна с Python

Я хотел бы зафиксировать некоторое состояние свернутого (чат) приложения, прочитав его со скриншота. Я знаю, как делать снимки видимых окон с помощью screencapture , но я не знаю, как обобщить это на свернутые окна. Кажется, это рабочий пример для окон: Скриншот неактивного окна Python PrintWindow + win32gui Есть ли эквивалент MacOS? изменить: мой вопрос не является дубликатом вопроса, связанного выше, потому что мне нужно больше, чем эквивалент win32 , мне нужна функция снимка экрана поверх него.

Возможный дубликат Что является альтернативой win32gui в Python 2.7 для Mac — person Constantin Guidon &nbsp schedule 15.07.2019

@ConstantinGuidon Спасибо, я использовал этот фрагмент / пример, чтобы найти решение моей проблемы. — person Learning is a mess &nbsp schedule 16.07.2019

Ответы (1)

from Quartz import CGWindowListCopyWindowInfo, kCGNullWindowID, kCGWindowListOptionAll import matplotlib.pyplot as plt from PIL import Image import os from uuid import uuid4 gen_filename = lambda : str(uuid4())[-10:] + '.jpg' def capture_window(window_name): window_list = CGWindowListCopyWindowInfo(kCGWindowListOptionAll, kCGNullWindowID) for window in window_list: try: if window_name.lower() in window['kCGWindowName'].lower(): filename = gen_filename() os.system('screencapture -l %s %s' %(window['kCGWindowNumber'], filename)) img = Image.open(filename) plt.imshow(img) plt.xticks([]) plt.yticks([]) os.remove(filename) break except: pass else: raise Exception('Window %s not found.'%window_name) 

Он использует screencapture , чтобы сохранить снимок экрана во временный файл, а затем загрузить его обратно в Python.

Источник

Скриншот перекрытого окна

Добрый день. Подскажите пожалуйста как можно сделать скриншот неактивного окна в python, не выводя его на передний план?
Например как это делает obs.
Нашел вот такое решение на с#, но к сожалению с# совсем не знаю. Снимок области неактивного окна
Также нашел вот такое решение, но она выводит окно на передний план и делает скриншот, т.е. такой вариант не подходит.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
import win32gui, win32con, ctypes from PIL import ImageGrab from ctypes import wintypes # this takes care of the DPI settings (https://stackoverflow.com/questions/51786794/using-imagegrab-with-bbox-from-pywin32s-getwindowrect) ctypes.windll.user32.SetProcessDPIAware() # get window handle and dimensions hwnd = win32gui.FindWindow(None, 'Calculator') dimensions = win32gui.GetWindowRect(hwnd) # this gets the window size, comparing it to `dimensions` will show a difference winsize = win32gui.GetClientRect(hwnd) # this sets window to front if it is not already win32gui.SetWindowPos(hwnd, win32con.HWND_NOTOPMOST,0,0,0,0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE) win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST,0,0,0,0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE) win32gui.SetWindowPos(hwnd, win32con.HWND_NOTOPMOST,0,0,0,0, win32con.SWP_SHOWWINDOW | win32con.SWP_NOMOVE | win32con.SWP_NOSIZE) # grab screen region set in `dimensions` image = ImageGrab.grab(dimensions) # we're going to use this to get window attributes f = ctypes.windll.dwmapi.DwmGetWindowAttribute # `rect` is for the window coordinates rect = ctypes.wintypes.RECT() DWMWA_EXTENDED_FRAME_BOUNDS = 9 # and then the coordinates of the window go into `rect` f(ctypes.wintypes.HWND(hwnd), ctypes.wintypes.DWORD(DWMWA_EXTENDED_FRAME_BOUNDS), ctypes.byref(rect), ctypes.sizeof(rect) ) # if we want to work out the window size, for comparison this should be the same as `winsize` size = (rect.right - rect.left, rect.bottom - rect.top) # put the window coordinates in a tuple like that returned earlier by GetWindowRect() dimensions = (rect.left, rect.top, rect.right, rect.bottom) # grab screen region set in the revised `dimensions` image = ImageGrab.grab(dimensions) image.save("test.png")

Источник

Читайте также:  Php log error messages

Как сделать скрин в свернутом рдп?

Есть скрипт, который делает скрин экрана через PIL. Далее ищет сходства на скрине с исходным образцом и делает какие то действия относительно сходства\отсутствия сходства.
Сложность. Запускается все это дело через РДП.
И если свернуть окно рдп. или же отключиться. ТО имеем след ошибку:

Exception in thread Thread-1: Traceback (most recent call last): File "C:\Phyton\lib\threading.py", line 950, in _bootstrap_inner self.run() File "C:\Phyton\lib\threading.py", line 888, in run self._target(*self._args, **self._kwargs) File "C:\Phyton\lib\site-packages\PIL\ImageGrab.py", line 43, in grab offset, size, data = Image.core.grabscreen_win32( OSError: screen grab failed

Подскажите. как это пофиксить. или же может есть иной вариан сделать скрин для анализа через рпд-который не будет крашиться если его свернуть.
Спасибо

HemulGM

Если окно RDP свернуто, то там нет ни каких изменений. Ты получишь в лучшем случае черный экран. Зачем «передавать» изображение (это я как бы со стороны RDP), если тебе оно не нужно.

Т.е. когда рдп свернут\отключен процессы идут, граф оболочка отключается.
Тогда мб еть мысли. каким образом можно считать изображение, которое должно быть на экране, но его нет т.к. откл рдп.

Есть решение — каскадное открытие rdp в другом rdp от другого пользователя. rdp окно в другом окне будет не свернуто а значит будет корректно обновлять содержимое, (там даже можно симулировать нажатия кнопок, мышки и прочее). Второе же окно, в котором все запущено можно сворачивать

Войдите, чтобы написать ответ

Python. Клиент, запущеный раньше сервера к нему не подключаеться. Как исправить?

Источник

Оцените статью