2015-06-15 2 views
2

Я пытаюсь получить скриншоты из окна приложения даже в случае минимизации, максимизации или любой формы окна. Я просмотрел другие вопросы, такие как this, но не нашел ответа, который я ищу.Окно приложения для скриншотов Python любого размера

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

def screenshot(hwnd = 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) 

    result = windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 0) 

    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(r"c:\python27\programs\check.bmp") 

Использование этого кода с максимально увеличивающимся окном дает отличный результат! enter image description here

Но когда окно усаживается ....... не так много

enter image description here

Я пытался редактировать эту строку, но в конечном итоге с akward результат: /. saveBitMap.CreateCompatibleBitmap(mfcDC, w+100, h+100)enter image description here

Кто-нибудь знает, как сделать снимок экрана полностью оконного приложения без максимизации, а затем снова окончить? Возможно, что-то похожее на использование win32con.SW_MAXIMIZE.

ответ

3

Почему бы не использовать pywinauto + Pillow/PIL?

from pywinauto import application 
app = application.Application().start("notepad.exe") 
app.Untitled_Notepad.CaptureAsImage().save('window.png') 
+1

Спасибо, что ответили! Хотя pywinauto FANTASTIC и способен сделать так много, этот метод является всего лишь оберткой для Imagegrab из PIL, которая просто берет захват экрана. Блокнот должен быть передним на экране. Я хочу посмотреть, возможно ли это, если это можно свести к минимуму или изменить размер и все еще иметь возможность фиксировать все, что происходит в графическом интерфейсе. Это не то, что отличается от использования 'от PIL импорта ImageGrab ImageGrab.grab ((100100200200)). Шоу()' Reference [CaptureAsImage] (https://code.google.com/p/pywinauto/source /browse/pywinauto/controls/HwndWrapper.py?name=0.4.1) – Alexander

Смежные вопросы