Python Screenshot of inactive window PrintWindow + win32gui

后端 未结 1 927
隐瞒了意图╮
隐瞒了意图╮ 2020-11-28 07:07

After hours of googling I managed to \"write\" this:

import win32gui
from ctypes import windll

hwnd = win32gui.FindWindow(None, \'Steam\')

hdc = win32gui.G         


        
相关标签:
1条回答
  • 2020-11-28 08:01

    After lots of searching and trying various different methods, the following worked for me.

    import win32gui
    import win32ui
    from ctypes import windll
    import Image
    
    hwnd = win32gui.FindWindow(None, 'Calculator')
    
    # Change the line below depending on whether you want the whole window
    # or just the client area. 
    #left, top, right, bot = win32gui.GetClientRect(hwnd)
    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)
    
    # Change the line below depending on whether you want the whole window
    # or just the client area. 
    #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")
    
    0 讨论(0)
提交回复
热议问题